Pagini recente » Cod sursa (job #2239518) | Cod sursa (job #322036) | Cod sursa (job #520259) | Cautari ortogonale | Cod sursa (job #102326)
Cod sursa(job #102326)
#include <stdio.h>
#include <stdlib.h>
#define Nmax 100001
struct nod { long inf; struct nod * urm;};
typedef nod * list;
int t;
long rad, n, i, Rez;
short radPos[Nmax];
list gr[Nmax];
long * d[Nmax];
long nrd=0;
long nrFii[Nmax];
void readNext();
void stergeVect();
long rez(long);
inline long max(long x, long y) { return (x==y)?(x+1): ( x>y?x:y ); }
long divide(long,long);
void qSort(long,long);
int main()
{
freopen("zvon.in", "r", stdin);
freopen("zvon.out", "w", stdout);
scanf("%d\n", &t);
for (int I=1; I<=t; I++)
{
readNext();
Rez=rez(rad);
printf("%ld\n", Rez);
stergeVect();
}
fclose(stdin);
fclose(stdout);
return 0;
}
void readNext()
{
long x, y;
scanf("%ld\n", &n);
for (i=1; i<n; i++)
{
scanf("%ld %ld\n", &x, &y);
list q=new nod;
q->inf=y;
if (gr[x])
{
q->urm=gr[x];
gr[x]=q;
nrFii[x]=1;
}
else
{
gr[x]=new nod;
gr[x]->inf=y;
gr[x]->urm=NULL;
nrFii[x]++;
}
radPos[y]=1;
}
for (i=1; i<=n & radPos[i]; i++);
rad=i;
}
void stergeVect()
{
list p;
for (i=1; i<=n; i++)
{
while (gr[i])
{
list q=gr[i];
gr[i]=gr[i]->urm;
delete q;
}
radPos[i]=0;
}
}
long rez(long x)
{
long temp=0, maxim=0;
list p;
if (!gr[x]) return 0;
else
{
nrd++;
d[nrd]=(long *)realloc(d[nrd],(nrFii[x]+3)*sizeof(long));
for (p=gr[x]; p; p=p->urm)
d[nrd][++temp]=rez(p->inf);
qSort(1,temp);
for (i=1; i<=temp; i++)
maxim=max(maxim,d[nrd][i]+temp-i+1);
nrd--;
return maxim;
}
}
long divide(long p, long q)
{
long st=p, dr=q, x=d[nrd][p];
while (st < dr)
{
while ( st<dr && d[nrd][dr]>=x ) dr--;
d[nrd][st]=d[nrd][dr];
while ( st<dr && d[nrd][st]<=x ) st++;
d[nrd][dr]=d[nrd][st];
}
d[nrd][st]=x;
return st;
}
void qSort(long p, long q)
{
long m=divide(p,q);
if (m-1>p) qSort(p, m-1);
if (m+1<q) qSort(m+1, q);
}