Cod sursa(job #209238)

Utilizator alexeiIacob Radu alexei Data 21 septembrie 2008 15:16:09
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#include<vector>
#define NMAX 100024
using namespace std;
int sol[NMAX],S[NMAX];
vector< int >q[NMAX];
bool viz[NMAX],father[NMAX];//de fapt viz e inutil
int sf;

void df(const int nod)
{
     vector< int >::iterator it;
     int ex;
     
     for( it=q[nod].begin(); it!=q[nod].end(); ++it)
     {
          if( viz[ *it ]==false )
          {
              S[++sf]=*it;
              viz[*it]=true;
              if( sol[*it] ){
                  ex=sf-sol[*it];
                  sol[*it]=sol[S[ex]]+1;
              }
              df(*it);
              --sf;
          }
     }
}

int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    
    int N;
    scanf("%d",&N);
    int i;
    for(i=1; i<=N; ++i)
             scanf("%d",&sol[i]);
    int a1,a2;
    for(i=1; i<N; ++i){
             scanf("%d%d",&a1,&a2);   
             q[a1].push_back(a2);
             father[a2]=true;
    }
    int source;
    for(i=1; i<=N; ++i)
             if( father[i]==false ){
             source=i;break;}
    viz[source]=true;
    S[1]=source;sf=1;
    df(source);
    for(i=1; i<=N; ++i)
             printf("%d ",sol[i]);
    printf("\n");
    return 0;
}