Cod sursa(job #100283)

Utilizator raula_sanChis Raoul raula_san Data 12 noiembrie 2007 00:54:35
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.92 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>

#define maxN 100001

using namespace std;

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

struct elem
{
    int nod;
    int nv;
};

class comp
{
    public:
        bool operator()(elem a, elem b)
        {
            return a.nv < b.nv;
        }
};

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

void df_niv(int nod)
{
    Viz[nod] = 1;

    int i;
    for(i=0; i<V[nod].size(); ++i)
        if(!Viz[V[nod][i]])
        {
            Niv[V[nod][i]] = Niv[nod] + 1;
            df_niv(V[nod][i]);

            if(!Nmax[V[nod][i]])
                Nmax[V[nod][i]] = Niv[V[nod][i]];
                
            Nmax[nod] = Nmax[nod] > Nmax[V[nod][i]] ? Nmax[nod] : Nmax[V[nod][i]];
        }
}

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

    int nod, i, k;
    elem x;

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

        for(i=0; i<V[nod].size(); ++i)
        {
            x.nod = V[nod][i];
            x.nv = 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);
        }

        Viz = 0;
        Niv[1] = 0;

        df_niv(1);

        T[1] = 0;
        bfs();

        int sol = 0;

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

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

    fclose(stdin);
    fclose(stdout);

    return 0;
}