Cod sursa(job #180189)

Utilizator c_sebiSebastian Crisan c_sebi Data 16 aprilie 2008 18:43:40
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <stdio.h>
#define NMAX 100001

int n, c[NMAX], nr[NMAX], viz[NMAX], st[NMAX], poz;

struct nod{
	int inf;
	nod *urm;
} *G[NMAX];

void add(nod*&p, int x){
	nod *q=new nod;
	q->inf=x;
	q->urm=p;
	p=q;
}


void read(){
	FILE *f=fopen("cerere.in", "r");
	fscanf(f, "%d", &n);
	int i, x, y;
	for(i=1; i<=n; ++i)
		fscanf(f, "%d ", &c[i]);
	for(i=1; i<n; ++i) {
		fscanf(f, "%d %d", &x, &y);
		add(G[x], y); viz[y]++;
	}
}

void df(int v){
	if(poz>0)
		if(c[v]) nr[v] = 1 + nr[st[poz-c[v]]];
	st[poz++]=v;
	viz[v]=1;
	nod *p;
	for(p=G[v]; p; p=p->urm)
		if(!viz[p->inf]){
			df(p->inf);
			poz--;
		}
}

int main(){
	read();
	FILE *g=fopen("cerere.out", "w");
	int i, r;
	for(i=1; i<=n; viz[i++]=0)
		if(!viz[i]) r=i;
//	st[poz++]=r;
	df(r);
	for(i=1; i<=n; ++i)
		fprintf(g, "%d ", nr[i]);
	fclose(g);
	return 0;
}