Cod sursa(job #34581)

Utilizator crusRus Cristian crus Data 20 martie 2007 21:46:03
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <stdio.h>
#define input "cerere.in"
#define output "cerere.out"
#define nmax 100001
long n,i,k[nmax],t[nmax],tata;
struct nod{int v; nod *urm;} *prim[nmax];
void citire()
{
	FILE *fin;
	long a,b;
	nod *q;
	fin=fopen(input,"r");
	fscanf(fin,"%ld",&n);
	for (i=1;i<=n;i++)
		fscanf(fin,"%ld",&k[i]);
	for (i=1;i<=n;i++) prim[i]=NULL;
	for (i=1;i<n;i++)
		{
		 fscanf(fin,"%ld %ld",&a,&b);
		 t[b]=a;
		 q=new nod;		 
		 q->v=b;
		 q->urm=prim[a];
		 prim[a]=q;
		}
}
void df(long x)
{
	nod *q;	
	if (k[x]!=0) k[x]=1+k[t[x]];
	q=prim[x];
	while (q)
		{		 
		 df(q->v);
		 q=q->urm;		 
		}
}
void solve()
{
	for (i=1;i<=n;i++)
		if (!t[i]) {tata=i; break;}
	df(tata);	
}
void afisare()
{
	FILE *fout;
	fout=fopen(output,"w");
	for (i=1;i<=n;i++) fprintf(fout,"%ld ",k[i]);
	fclose(fout);
}
int main()
{
	citire();
	solve();
	afisare();
	return 0;
}