Pagini recente » Cod sursa (job #167242) | Cod sursa (job #442210) | Cod sursa (job #2770365) | Cod sursa (job #2383660) | Cod sursa (job #14803)
Cod sursa(job #14803)
// INFOARENA CERERE 100pct
#include<stdio.h>
#include<stdlib.h>
#define maxn 100001
int n, rez[maxn], *a[maxn], x[maxn], pas[maxn], nr, pred[maxn];
bool viz[maxn];
void BFS(int k)
{
viz[k]=1;
if( !rez[k]) pas[k]=0;
else pas[k]= 1+ pas[ x[nr-rez[k]]];
for(int i=1; i<=a[k][0]; ++i) if( !viz[a[k][i]]) {
x[++nr]= a[k][i];
BFS( a[k][i]);
}
nr--;
}
int rad()
{
int k=n;
while(pred[k]) k= pred[k];
return k;
}
int main()
{
FILE *f=fopen("cerere.in","r");
fscanf(f,"%d",&n);
int i, x, y;
for(i=0;i<=n+2;++i) {
a[i]=(int*)malloc(sizeof(int));
a[i][0]=0;
}
for(i=1; i<=n; ++i) fscanf(f,"%d",&rez[i]);
for(i=1; i<=n-1; ++i) {
fscanf(f,"%d %d",&x,&y);
a[x][0]++;
a[x]= (int*)realloc(a[x], sizeof(int)*a[x][0]+2);
a[x][ a[x][0]]= y;
pred[y]=x;
}
fclose(f);
///printf("%d ",rad());
BFS( rad());
FILE *g=fopen("cerere.out","w");
for(i=1; i<=n; ++i) fprintf(g,"%d ",pas[i]);
fprintf(g,"\n");
return 0;
}