Pagini recente » Cod sursa (job #472677) | Cod sursa (job #1089982) | Cod sursa (job #1428054) | Cod sursa (job #1628516) | Cod sursa (job #130342)
Cod sursa(job #130342)
#include <stdio.h>
#define nmax 110000
struct nod {long info; nod *next;};
FILE*f=fopen("zvon.in","r");
FILE*g=fopen("zvon.out","w");
long n,i,j,t,max,v1,v2,k,nm,vl,valo,ct;
void heapsort(long n);
void solv();
//inserare pe prima pozitie
void qin(nod*& first, long vl)
{
nod* p;
p=new nod;
p->info=vl;
p->next=first;
first=p;
}
//eliminare din prima pozitie
void qout(nod*& first, long& vl)
{
nod* p;
vl=first->info;
p=first;
first=first->next;
delete(p);
}
nod *fii[nmax],*nivel[nmax];
long tmin[nmax],niv[nmax],child[nmax];
void solv()
{
fscanf(f,"%ld",&n);
niv[1]=1; nm=1; qin(nivel[1],1);
for (i=1; i<=n-1; i++)
{
fscanf(f,"%ld %ld",&v1,&v2);
qin(fii[v1],v2);
niv[v2]=niv[v1]+1;
qin(nivel[niv[v2]],v2);
if (niv[v2]>nm) nm=niv[v2];
}
for (i=nm-1; i>=1; i--)
{
while (nivel[i]!=NULL)
{
qout(nivel[i],vl);
ct=0;
while (fii[vl]!=NULL)
{
qout(fii[vl],valo);
ct++;
child[ct]=tmin[valo];
}
heapsort(ct);
max=0;
for (j=1; j<=ct; j++)
if (child[j]+j>max) max=child[j]+j;
tmin[vl]=max;
}
}
fprintf(g,"%ld\n",tmin[1]);
while (nivel[1]!=NULL) qout(nivel[1],vl);
while (nivel[nm]!=NULL) qout(nivel[nm],vl);
}
void heapsort(long n)
{
long i,j,k,aux;
for (i=1; i<=n; i++)
{
j=i;
while ((j >> 1!=0)&&(child[j >> 1]>child[j]))
{
aux=child[j >> 1]; child[j >> 1]=child[j]; child[j]=aux; j=j >> 1;
}
}
i=n;
while (i>1)
{
aux=child[1]; child[1]=child[i]; child[i]=aux; i--; j=1;
while (j>0)
{
k=2*j;
if (k>i) break;
if ((k+1<=i)&&(child[k+1]<child[k])) k++;
if (child[j]<=child[k]) break;
aux=child[j]; child[j]=child[k]; child[k]=aux; j=k;
}
}
}
int main()
{
fscanf(f,"%ld",&t);
for (k=1; k<=t; k++) solv();
return 0;
}