Cod sursa(job #1341167)

Utilizator avaspAva Spataru avasp Data 12 februarie 2015 15:33:54
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb

#include<cstdio>
#include<vector>
using namespace std;
vector<int>v[100001];
bool vc[100001];
int a,b,n;
int coada[100001];
int vec[100001],tata[100001],rez[100001];
void bfs(int nod){
  int ic,sf;
  ic=1;
  sf=1;
  coada[1]=nod;
  while(ic<=sf){
    for(int i=0;i<v[coada[ic]].size();i++){
        sf++;
        coada[sf]=v[coada[ic]][i];
        tata[v[coada[ic]][i]]=coada[ic];
    }
    ic++;
  }
}


int main(){
  freopen("cerere.in","r",stdin);
  freopen("cerere.out","w",stdout);
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
    scanf("%d",&vec[i]);
  for(int i=1;i<=n-1;i++){
    scanf("%d%d",&a,&b);
    v[a].push_back(b);
    vc[b]=true;
  }
  for(int i=1;i<=n;i++)
    if(vc[i]==false)
      bfs(i);
  int maim, mmaim,rezu,pp;
  for(int i=1;i<=n;i++)
	rez[i]=-1;
  for(int i=1;i<=n;i++){
	maim=coada[i];
	mmaim=maim;
	rezu=0;
	pp=0;
	while(vec[mmaim]!=0&&pp==0){
		if(rez[mmaim]!=-1){
			rezu+=rez[mmaim];
			mmaim=tata[mmaim];
			pp=1;
		}
		else{
			rezu++;
			int cv=vec[mmaim];
			while(cv){
				mmaim=tata[mmaim];
				cv--;
			}
		}
	}
	rez[maim]=rezu;
  }
  for(int i=1;i<=n;i++)
	printf("%d ",rez[i]);
  return 0;
}