Mai intai trebuie sa te autentifici.
Cod sursa(job #96784)
Utilizator | Data | 3 noiembrie 2007 13:38:02 | |
---|---|---|---|
Problema | Zvon | Scor | Ascuns |
Compilator | cpp | Status | done |
Runda | Marime | 1.17 kb |
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define pb push_back
#define vit vector<int>::iterator
#define MAX(a,b) ((a) > (b) ? (a) : (b))
int N, root, A[1<<17], viz[1<<17];
vector<int> G[1<<17];
int aux[1<<17];
void dfs(int x)
{
if(G[x].size() == 0) { A[x] = 0; return ; }
int i, j, p = 0, ret = -1, k = G[x].size();
for(vit it = G[x].begin(); it != G[x].end(); ++it)
dfs(*it), aux[++p] = A[*it];
sort(aux+1, aux+p+1);
for(i = 1, j = k; i <= k; i++, j--)
ret = MAX(ret, aux[i]+j);
A[x] = ret;
}
void read_and_solve(void)
{
int i, a, b;
scanf("%d ", &N);
for(i = 1; i <= N; i++) viz[i] = A[i] = 0, G[i].clear();
for(i = 1; i < N; i++)
scanf("%d %d", &a, &b), G[a].pb(b), viz[b] = 1;
for(i = 1; i <= N; i++)
if(!viz[i]) root = i;
dfs(root);
printf("%d\n", A[root]);
}
int main(void)
{
freopen("zvon.in", "rt", stdin);
freopen("zvon.out", "wt", stdout);
int teste;
scanf("%d ", &teste);
while(teste--)
read_and_solve();
return 0;
}