Pagini recente » Cod sursa (job #714927) | Cod sursa (job #940331) | Cod sursa (job #1822376) | Cod sursa (job #311480) | Cod sursa (job #346086)
Cod sursa(job #346086)
#include <stdio.h>
#include <list>
using namespace std;
list<int>a[100010];
int aux[100010], stramosi[100010], maimuta[100010], v[100010], st[100010], nr=1;
void DF(int k, int niv);
int main() {
int i, n, x, y, radacina=0;
memset(aux, 1, sizeof(aux));
FILE *in=fopen("cerere.in","r"),*out=fopen("cerere.out","w");
fscanf(in, "%d", &n);
for(i=1; i<=n; i++) {
fscanf(in, "%d", &stramosi[i]);
}
for(i=1; i<=n-1; i++) {
fscanf(in, "%d%d", &x, &y);
a[x].push_back(y);
aux[y]=0;
}
for(i=1; i<=n; i++) {
if(aux[i]>0) {
radacina=i; break;
}
}
memset(v, -1, sizeof(v));
maimuta[1]=0;
DF(radacina, 1);
for(i=1; i<=n; i++) {
fprintf(out, "%d ", maimuta[i]);
}
fclose(in); fclose(out);
return 0;
}
void DF(int k, int niv) {
st[niv]=k;
if(stramosi[k]==0) {
maimuta[k]=0;
}
else {
maimuta[k]=maimuta[st[niv-stramosi[k]]]+1;
}
for(list<int>::iterator it=a[k].begin(); it!=a[k].end(); it++) {
if(v[*it]==-1) {
v[*it]=1;
DF(*it, niv+1);
}
}
}