Cod sursa(job #596089)

Utilizator maritimCristian Lambru maritim Data 15 iunie 2011 20:20:37
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#include<malloc.h>

#define MaxN 100100

typedef struct _nod
{
	int info;
	struct _nod *adr;
} nod;

typedef struct
{
	struct _nod *cap;
} list;

list A[MaxN];
int K[MaxN];
int sol[MaxN];
int V[MaxN];
bool viz[MaxN];
int N;

void add(int a,int b)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = b;
	nou->adr = A[a].cap;
	A[a].cap = nou;
}

void citire(void)
{
	int a;
	int b;
	FILE *f = fopen("cerere.in","r");
	
	fscanf(f,"%d ",&N);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&K[i]);
	for(int i=1;i<=N-1;i++)
	{
		fscanf(f,"%d %d",&a,&b);
		add(a,b);
		viz[b] = true;
	}
	
	fclose(f);
}

int FindRad(void)
{
	int i;
	for(i = 1;viz[i];i++);
	return i;	
}

void parcurgere(int a,int k)
{
	V[k] = a;
	nod *q = A[a].cap;
	while(q)
	{
		if(K[q->info])
			sol[q->info] = sol[V[k-K[q->info]+1]] + 1;
		parcurgere(q->info,k+1);
		q = q->adr;
	}
}

int main()
{
	FILE *g = fopen("cerere.out","w");
	
	citire();
	parcurgere(FindRad(),1);
	for(int i=1;i<=N;i++)
		fprintf(g,"%d ",sol[i]);
	
	fclose(g);
	return 0;
}