Cod sursa(job #190262)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 21 mai 2008 12:51:35
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FIN "cerere.in"
#define FOUT "cerere.out"

#define NMAX 100004

typedef struct nod
{
	int info;
	struct nod * next;
}NOD;

NOD * V[NMAX];
int N, ST[NMAX], H[NMAX], G[NMAX], SEL[NMAX];

void add( NOD * & p, int x )
{
	NOD * q = new NOD;
	q->info = x;
	q->next = NULL;
	if( !p )
		p = q;
	else
	{
		q->next = p;
		p = q;
	}
}

void DFS( int nod, int level )
{
	NOD * tmp = V[nod];
	if( H[nod] ) 
		G[nod] = G[ST[level - H[nod]]] + 1;
	ST[level] = nod;
	while( tmp )
	{
		DFS( tmp->info, level + 1 );
		tmp = tmp->next;
	}
}


int main()
{
	int i, root, X, Y;
	FILE * fin = fopen( FIN, "r" );
	FILE * fout = fopen( FOUT, "w" );
	fscanf( fin, "%d", &N );
	for( i = 1; i <= N; i++ )
		fscanf( fin, "%d", H + i);
	for( i = 1; i < N; i++ )
	{
		fscanf( fin, "%d%d", &X, &Y );
		add( V[X], Y );
		SEL[Y] = 1;
		
	}
	
	for( i = 1; i <= N; i++ )
		if( !SEL[i] )
			root = i;
	
	DFS( root, 1 );
	for( i = 1; i <= N; i++ )
		fprintf( fout, "%d ", G[i] );
	fclose( fin );
	fclose( fout );
			
	return 0;
}