Pagini recente » Cod sursa (job #37781) | Borderou de evaluare (job #1570984) | Cod sursa (job #297228) | Cod sursa (job #2771530) | Cod sursa (job #34581)
Cod sursa(job #34581)
#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;
}