Pagini recente » Cod sursa (job #1427503) | Cod sursa (job #1305137) | Cod sursa (job #1333720) | Cod sursa (job #1025019) | Cod sursa (job #1891144)
#include <stdio.h>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
FILE *fin = fopen("zvon.in", "r");
FILE *fout = fopen("zvon.out", "w");
#define SIGMA 100001
vector <int> fiu[SIGMA];
char efiu[SIGMA];
char vizitat[SIGMA];
int v[SIGMA];
int antidfs[SIGMA];
int raspuns[SIGMA];
int main()
{
int n,t;
int trebuie;
fscanf(fin, "%d", &t);
for(int q=1;q<=t;q++)
{
fscanf(fin, "%d", &n);
for(int i=1;i<n;i++)
{
int x,y;
fscanf(fin, "%d%d", &x,&y);
fiu[x].push_back(y);
efiu[y]=1;
}
stack <int> frontiera;
for(int i=1;i<=n;i++)
{
if(efiu[i]==0)
{
frontiera.push(i);
trebuie=i;
vizitat[i]=1;
}
}
int ramas=1;
while(!frontiera.empty())
{
int nod = frontiera.top();
frontiera.pop();
antidfs[ramas]=nod;
ramas++;
for(int node : fiu[nod])
{
if(vizitat[node]==0)
{
vizitat[node]=1;
frontiera.push(node);
}
}
}
ramas--;
int maxim=0;
int cnt=0;
for(int i=ramas;i>=1;i--)
{
cnt=0;
maxim=0;
for(auto node : fiu[i])
{
cnt++;
v[cnt] = raspuns[node];
}
sort(v+1,v+cnt+1);
for(int j=1;j<=cnt;j++)
{
if(maxim<cnt-j+1+v[j]) maxim = v[j]+cnt-j+1;
}
raspuns[i]=maxim;
}
fprintf(fout, "%d\n", raspuns[trebuie]);
for(int i=1;i<=n;i++)
{
vizitat[i]=0;
efiu[i]=0;
raspuns[i]=0;
while(!fiu[i].empty()) fiu[i].pop_back();
}
}
return 0;
}