Pagini recente » Cod sursa (job #1810565) | Cod sursa (job #3286001) | Cod sursa (job #3277680) | Cod sursa (job #2406409) | Cod sursa (job #99708)
Cod sursa(job #99708)
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;
#define in "zvon.in"
#define out "zvon.out"
#define dim 100001
int T, N, M;
int gasit, size=1, act_size=1, k;
int Vec[dim], list[2*dim];
bool Sel[dim], G[dim];
vector< vector<int> > L;
void DF(int);
int main()
{
int X, Y;
int maxim, poz;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &T);
for ( ; T > 0; T-- )
{
scanf("%d", &N);
memset(Sel,0,sizeof(Sel));
memset(Vec,0,sizeof(Vec));
L.clear();
L.resize(N+1);
if ( N == 1 )
{
printf("0\n");
continue;
}
for ( int i = 1; i < N; i++ )
scanf("%d%d", &X, &Y), L[X].push_back(Y);
DF(1);
memset(Sel,0,sizeof(Sel));
memset(G,0,sizeof(G));
size=1;
list[size] = 1;
act_size = 1;
M = N;
int Q = 0;
// while ( M )
{
for ( int i = 1; i <= act_size; i++ )
{
maxim = -1;
poz = -1;
k = list[i];
if ( G[k] == 1 ) continue;
for ( int j = 0; j < L[k].size(); j++ )
{
if ( !Sel[L[k][j]] ) // nu il am in lista
if ( maxim < Vec[L[k][j]] ) maxim = Vec[L[k][j]], poz = L[k][j]; // are numar maxim de subordonati ?
}
if ( poz == -1 ) M -= 1, G[k] = 1;
else if ( poz == 0 ) Sel[poz] = 1;
else size++, list[size] = poz, Sel[poz] = 1;
}
act_size = size;
if ( M > 0 ) Q++;
}
printf("%d\n", Q);
}
}
void DF(int nod)
{
gasit = 0;
Sel[nod] = 1;
for ( int i = 0; i < L[nod].size(); i++ )
{
if ( !Sel[L[nod][i]] )
{
DF(L[nod][i]);
Vec[nod] += Vec[L[nod][i]] + 1;
}
}
if ( L[nod].size() == 0 ) Vec[nod] = 0;
}