Cod sursa(job #443497)

Utilizator nandoLicker Nandor nando Data 17 aprilie 2010 09:32:57
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

FILE* fin=fopen("cerere.in","r");
FILE* fout=fopen("cerere.out","w");

#define MAX 100010
typedef vector<int>::iterator iter;

bitset<MAX> notRoot,viz;
vector<int> arb[MAX];
int g[MAX],k[MAX],stack[MAX],sp=0,n;

void dfs(int nod,int lvl){
	if(k[nod]==0){
		g[nod]=0;	
	}else{
		g[nod]=g[stack[lvl-k[nod]]]+1;	
	}
	
	stack[++sp]=nod;
	viz[nod]=true;
	
	for(iter it=arb[nod].begin();it!=arb[nod].end();it++){
		if(!viz[*it]){
			dfs(*it,lvl+1);	
		}
	}
	
	sp--;
}

int main(){
	fscanf(fin,"%d ",&n);
	
	for(int i=1;i<=n;i++){
		fscanf(fin,"%d ",&k[i]);	
	}
	
	int a,b,top;
	for(int i=1;i<n;i++){
		fscanf(fin,"%d %d\n",&a,&b);
		arb[a].push_back(b);
		notRoot[b]=true;
	}
	for(int i=1;i<=n;i++){
		if(!notRoot[i]){	
			dfs(i,1);
		}
	}
	for(int i=1;i<=n;i++){
		fprintf(fout,"%d ",g[i]);	
	}
			
	fclose(fin);
	fclose(fout);
	return 0;	
}