Pagini recente » Cod sursa (job #2990438) | Cod sursa (job #2403876) | Cod sursa (job #121079) | Cod sursa (job #2842584) | Cod sursa (job #91736)
Cod sursa(job #91736)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define NMAX 100100
int q[NMAX], tmin[NMAX], sz[NMAX], len[NMAX];
char viz[NMAX];
vector<int> f[NMAX];
vector<pair<int, int> > tf;
int i, j, k, N, le, ri, n;
void compute(int n)
{
int tc;
tmin[n] = 0;
len[n] = 0;
sz[n] = 1;
tf.clear();
for (i = 0; i < f[n].size(); i++)
{
if (len[f[n][i]] > len[n])
len[n] = len[f[n][i]];
sz[n] += sz[f[n][i]];
tf.push_back(make_pair(len[f[n][i]], f[n][i]));
}
len[n]++;
sort(tf.begin(), tf.end());
for (i = f[n].size() - 1, tc = 1; i >= 0; i--, tc++)
if (tc + tmin[tf[i].second] > tmin[n])
tmin[n] = tc + tmin[tf[i].second];
}
int main()
{
int T;
freopen("zvon.in", "r", stdin);
freopen("zvon.out", "w", stdout);
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
memset(f, 0, sizeof(f));
// read the edges
for (k = 1; k < N; k++)
{
scanf("%d %d", &i, &j);
f[i].push_back(j);
}
// BF on the tree, starting from node 1
memset(viz, 0, sizeof(viz));
q[le = ri = 1] = 1;
viz[1] = 1;
while (le <= ri)
{
n = q[le];
for (i = 0; i < f[n].size(); i++)
{
j = f[n][i];
if (!viz[j])
{
ri++;
q[ri] = j;
viz[j] = 1;
}
}
le++;
}
for (j = N; j >= 1; j--)
compute(q[j]);
printf("%d\n", tmin[1]);
}
return 0;
}