Cod sursa(job #100499)

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

#define maxN 100001

using namespace std;

int Tt;
int N;
int Nr[maxN];
int Niv[maxN];
int Nmax[maxN];
int T[maxN];
int Bfq[maxN];

struct elem
{
    int nod;
    int nmax;
    int nr;
};

class comp
{
    public:
        bool operator()(elem a, elem b)
        {
            if(a.nr == b.nr)
                return a.nmax < b.nmax;

            else
                return a.nr < b.nr;
        }
};

vector <int> V[maxN];
queue <int> q;
priority_queue<elem, vector <elem>, comp> pq;

void bf_niv()
{
    int i, j, n, st, end;

    Bfq[1] = 1;
    st = end = 1;

    while(st <= end)
    {
        n = V[Bfq[st]].size();

        for(i=0; i<n; ++i)
        {
            Niv[V[Bfq[st]][i]] = Niv[Bfq[st]] + 1;
            Bfq[++end] = V[Bfq[st]][i];
        }

        ++ st;
    }

    for(i=end; i>=1; --i)
    {
        n = V[Bfq[i]].size();

        if(!n)
        {
            Nmax[Bfq[i]] = Niv[Bfq[i]];
            Nr[Bfq[i]] = 1;
        }
        else
        {
            Nmax[Bfq[i]] = 0;
            Nr[Bfq[i]] = 1;
            
            for(j=0; j<n; ++j)
            {
                if(Nmax[V[Bfq[i]][j]] > Nmax[Bfq[i]])
                    Nmax[Bfq[i]] = Nmax[V[Bfq[i]][j]];
                Nr[Bfq[i]] += Nr[V[Bfq[i]][j]];
            }
        }
    }
}

void bfs()
{
    q.push(1);

    int nod, i, k, n;
    elem x;

    while(q.empty() == false)
    {
        nod = q.front();
        q.pop();

        n = V[nod].size();

        for(i=0; i<n; ++i)
        {
            x.nod = V[nod][i];
            x.nr = Nr[x.nod];
            x.nmax = Nmax[x.nod];
            pq.push(x);
        }

        k = 1;

        while(pq.empty() == false)
        {
            x = pq.top();
            pq.pop();
            q.push(x.nod);

            T[x.nod] = T[nod] + k;
            ++ k;    
        }
    }
}

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

    int i, a, b;

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

        Niv[1] = 0;
        bf_niv();
        bfs();

        int sol = 0;

        for(i=1; i<=N; ++i)
        {
            sol = T[i] > sol ? T[i] : sol;
            T[i] = 0;
            V[i].clear();
        }

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

    fclose(stdin);
    fclose(stdout);

    return 0;
}