Cod sursa(job #403062)

Utilizator mihaionlyMihai Jiplea mihaionly Data 24 februarie 2010 15:51:35
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <fstream>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
#define nmax 100005
int str[nmax],st[nmax],sol[nmax],tata[nmax],rad;
bool viz[nmax];
int n;
typedef struct nod
 {
 int x;
 nod *urm;
 } arbore;
void add(arbore *&a,int x)
 {
 arbore *p=new arbore;
 p->x=x;
 p->urm=a;
 a=p;
 }
arbore *A[nmax];
void read()
 {
 f>>n;
 int i,x,y;
 for(i=1;i<=n;i++) f>>str[i];
 for(i=1;i<n;i++)
  {
  f>>x>>y;
  tata[y]=x;
  add(A[x],y);
  add(A[y],x);
  }
 for(i=1;i<=n;i++)
  {
  if(tata[i]==0)
   {
   rad=i;
   break;
   }
  }
 }
void dfs(int x,int i)
 {
 viz[x]=true;
 if(str[x]==0)
  st[i]=0;
 else
  st[i]=1+st[i-str[x]];
 sol[x]=st[i];
 for(arbore *p=A[x];p!=NULL;p=p->urm)
  {
  if(!viz[p->x])
   dfs(p->x,i+1);
  }
 }
int main()
 {
 read();
 dfs(rad,1);
 for(int i=1;i<=n;i++)
  g<<sol[i]<<" ";
 }