Cod sursa(job #346086)

Utilizator vladiiIonescu Vlad vladii Data 6 septembrie 2009 17:55:24
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#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);
            }
     }
}