Cod sursa(job #346085)

Utilizator vladiiIonescu Vlad vladii Data 6 septembrie 2009 17:53:29
Problema Cerere Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <list>
using namespace std;
list<int>a[10000];
int aux[10000], stramosi[10000], maimuta[10000], v[10000], p[10000], st[10000], nr=1;
void DF(int k, int niv);
int main() {
    int i, n, x, y, radacina;
    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; p[radacina]=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; nr++;
                  p[*it]=nr;
                  DF(*it, niv+1);
            }
     }
}