Cod sursa(job #253236)

Utilizator RobybrasovRobert Hangu Robybrasov Data 5 februarie 2009 16:25:07
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define N 100010

using namespace std;

int rez[N],t,n,x,y,i,V[N],fii[N];
vector<int> L[N];

bool cmp(int i, int j)
{
    return rez[i]>rez[j];
}

int maxim(int nod)
{
    vector<int>::iterator it;
    int mmax=0,kont=0;
    for (it=L[nod].begin(); it!=L[nod].end(); it++)
        V[++kont]=*it;
    sort(V+1,V+kont+1,cmp);
    for (i=1; i<=kont; i++)
        if (i+rez[V[i]]>mmax)
            mmax=i+rez[V[i]];

    return mmax;
}

void zvon(int nod)
{
    vector<int>::iterator it;
    for (it=L[nod].begin(); it!=L[nod].end(); it++)
    {
        int nr=*it;
        if (fii[nr])
        {
            zvon(nr);
            fii[nr]=0;
            fii[nod]--;
        }
        else fii[nod]--;
    }
    if (!fii[nod])
        rez[nod]=maxim(nod);
}

int main()
{
	freopen("zvon.in","r",stdin);
	freopen("zvon.out","w",stdout);
	scanf("%d\n",&t);
	while (t--)
	{
	    scanf("%d\n",&n);
	    for (i=1; i<n; i++)
	    {
	        scanf("%d%d\n",&x,&y);
	        L[x].push_back(y);
	        fii[x]++;
	    }
	    zvon(1);
	    printf("%d\n",rez[1]);
	    memset(rez,0,sizeof(rez));
	    memset(fii,0,sizeof(fii));
	    for (i=1; i<=n; i++) L[i].clear();
	}

	return 0;
}