Cod sursa(job #607373)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 11 august 2011 19:32:37
Problema Cerere Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>

#define Nmax 100000

int	k[Nmax], // stramos de intrebat
	nrt[Nmax], // numar de tati al nodului i
	sol[Nmax], // nr de drumuri pt fiecare
	cur[Nmax]; // nodul corespunzator nivelului i , din parcurgerea curenta in adancime a arborelui
int N;
int rad;

void dfs(int nod,int nivel);

struct fiu{
	int nrfiu;
	fiu* prev;
}fii[Nmax];

int main(int argc, char* argv[])
{
	int i;
	int t,f;
	fiu* aux;

	FILE *fpr,*fpw;
	fpr = fopen("cerere.in","r");
	fpw = fopen("cerere.out","w");

	fscanf(fpr,"%d",&N);
	for(i=1;i<=N;i++)
		fscanf(fpr,"%d",&k[i]);
	for(i=1;i<N;i++){
		fscanf(fpr,"%d %d",&t,&f);

		aux = new fiu;
		aux->nrfiu = f;
		aux->prev = fii[t].prev;
		fii[t].prev = aux;
		nrt[f]++;
	}
	for(i=1;i<=N;i++)
		if(nrt[i] == 0){
			rad = i;
			break;
		}

	dfs(rad,1);

	for(i=1;i<=N;i++)
		fprintf(fpw,"%d ",sol[i]);

	fclose(fpr);
	fclose(fpw);
	return 0;
}

void dfs(int nod,int nivel)
{
	cur[nivel] = nod;

	if(k[nod] != 0 )
		sol[nod] = sol[cur[nivel-k[nod]]]+1 ; // daca nu este intelept
											// se adauga 1 la solutia obtinuta pentru al k[nod]-ulea stramos

	fiu* aux = fii[nod].prev;
	while(aux != NULL){
		dfs(aux->nrfiu,nivel+1);
		aux = aux->prev;	
	}
}