Cod sursa(job #346082)

Utilizator vladiiIonescu Vlad vladii Data 6 septembrie 2009 17:29:38
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <conio.h>
#include <list>
using namespace std;
list<int>a[10000];
int aux[10000], stramosi[10000], maimuta[10000], v[10000], p[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=radacina; i<n+radacina; i++) {
          fprintf(out, "%d ", maimuta[p[i]]);
    }
    fclose(in); fclose(out);
    return 0;
}

void DF(int k, int niv) {
     for(list<int>::iterator it=a[k].begin(); it!=a[k].end(); it++) {
            if(v[*it]==-1) {
                  v[*it]=1; nr++;
                  if(stramosi[*it]==0) {
                      maimuta[nr]=0;
                  }
                  else {
                      maimuta[nr]=maimuta[niv-stramosi[*it]]+1;
                  }
                  p[*it]=nr;
                  DF(*it, niv+1);
            }
     }
}