Cod sursa(job #100589)

Utilizator raula_sanChis Raoul raula_san Data 12 noiembrie 2007 14:23:13
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.67 kb
#include <cstdio>
#include <vector>
#include <queue>

#define maxN 100001

using namespace std;

vector <int> V[maxN];

int sol;

int Lv[maxN];
int Lm[maxN];
int Nr[maxN];
int Ti[maxN];
int Co[maxN];

class comp
{
    public:
        bool operator()(int i, int j)
        {
            if(Nr[i] == Nr[j])
                return Lm[i] > Lm[j];

            return Nr[i] < Nr[j];
        };
};

priority_queue <int, vector <int>, comp> q;

void df(int k)
{
    int i, j, nod, n = V[k].size();

    Nr[k] = 1;

    if(!n)
        Lm[k] = Lv[k];

    for(i=0; i<n; ++i)
    {
        nod = V[k][i];
    
        Lv[nod] = Lv[k] + 1;

        df(nod);

        Nr[k] += Nr[nod];

        if(Lm[nod] > Lm[k])
            Lm[k] = Lm[nod];
    }
}

void bf()
{
    int st, end, nod, k, n, i, j;

    st = 1;
    end = 1;
    
    Co[1] = 1;

    while(st <= end)
    {
        nod = Co[st];
        ++ st;

        n = V[nod].size();

        for(i=0; i<n; ++i)
        {
            q.push(V[nod][i]);
            Co[++end] = V[nod][i];
        }

        V[nod].clear();

        j = 1;

        while(q.empty() == false)
        {
            k = q.top();
            q.pop();

            Ti[k] = Ti[nod] + j;
            ++ j;

            sol = Ti[k] > sol ? Ti[k] : sol;
        }
    }
}

int main()
{
    freopen("zvon.in", "rt", stdin);
    freopen("zvon.out", "wt", stdout);

    int T, N, a, b, i;

    for(scanf("%d", &T); T; --T)
    {
        for(scanf("%d", &N), i=1; i<N; ++i)
        {
            scanf("%d %d", &a, &b);
            V[a].push_back(b);
        }

        Ti[1] = 0;
        Lv[1] = 0;
        sol = 0;

        df(1);
        bf();

        printf("%d\n", sol);
    }

    return 0;
}