Cod sursa(job #3278411)

Utilizator PetrudpPetru Paun Petrudp Data 19 februarie 2025 18:02:21
Problema Zvon Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1e5;
vector<int> sum(N + 1, 1);

bool cmp(int a, int b)
{
    return sum[a] > sum[b];
}

void dfs_sum(int x, vector<vector<int>> &vec, vector<bool> &viz)
{
    viz[x] = true;
    for (auto y : vec[x])
    {
        if (!viz[y])
        {
            dfs_sum(y, vec, viz);
            sum[x] += sum[y];
        }
    }
}

void dfs(int x, vector<vector<int>> &vec, vector<bool> &viz, vector<int> &sol, int &maxi)
{
    viz[x] = true;
    maxi = max(sol[x], maxi);
    int ct = 1;
    for (auto y : vec[x])
    {
        if (!viz[y])
        {
            sol[y] = sol[x] + ct;
            ct++;
            dfs(y, vec, viz, sol, maxi);
        }
    }
}

int main()
{
    ifstream in("zvon.in");
    ofstream out("zvon.out");

    int t;
    in >> t;
    while (t--)
    {
        int n;
        in >> n;
        vector<vector<int>> vec(n + 1);
        vector<int> sum(n + 1, 1);
        vector<bool> tati(n + 1, true);
        for (int i = 1; i < n; i++)
        {
            int a, b;
            in >> a >> b;
            vec[a].push_back(b);
            tati[b] = false;
        }
        vector<bool> viz(n + 1, false);
        for (int i = 1; i <= n; i++)
        {
            if (tati[i])
            {
                dfs_sum(i, vec, viz);
            }
        }
        for (int i = 1; i <= n; i++)
        {
            sort(vec[i].begin(), vec[i].end(), cmp);
        }
        vector<int> sol(n + 1, 0);
        int maxi = 0;
        for (int i = 1; i <= n; i++)
        {
            viz[i] = false;
        }
        for (int i = 1; i <= n; i++)
        {
            if (tati[i])
            {
                dfs(i, vec, viz, sol, maxi);
            }
        }
        out << maxi << "\n";
        for (int i = 1; i <= n; i++)
        {
            sum[i] = 1;
        }
    }

    in.close();
    out.close();
    return 0;
}