Cod sursa(job #507406)

Utilizator bugyBogdan Vlad bugy Data 5 decembrie 2010 22:30:52
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
//problema cerere ->infoarena->  de pct metoda DSF -> stiva implementata manual
#include<stdio.h>
#include<stdlib.h> //pt realloc
#include<string.h> //pt memset
#define dim 100005
using namespace std;

int * A[dim],viz[dim],n,i,stiva[dim],v[dim],x,y,r,sol[dim];

void dfs(int x,int k)
{
	int i;
	viz[x]=1;
	stiva[k]=x;
	
	if(v[x]==0)
		sol[x]=0;
	else	sol[x]=sol[ stiva[k-v[x]] ]+1;
	
	for(i=1;i<=A[x][0];i++)
		if(!viz[ A[x][i] ])
			{ dfs(A[x][i],k+1 );
			stiva[k+1]=0;
			}

}

int main()
{
	FILE *f=fopen("cerere.in","r"), *g=fopen("cerere.out","w");
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
	fscanf(f,"%d",&v[i]);

for(i=1;i<=n;i++)
{
	A[i]=(int *)realloc(A[i],sizeof(int));
	A[i][0]=0;
}

for(i=1;i<n;i++)
{
	fscanf(f,"%d %d",&x,&y);
	viz[y]=1;
	A[x][0]++;
	A[x]=(int *)realloc(A[x], (A[x][0]+1)*sizeof(int));
	A[x][A[x][0]]=y;
	
}
for(i=1;i<=n;i++)
	if(viz[i]==0)
		{r=i;break;}
		
memset(viz,0,sizeof(viz));

dfs(r,1);
for(i=1;i<=n;i++)
	fprintf(g,"%d ",sol[i]);
fprintf(g,"\n");


fclose(f);
fclose(g);

return 0;
}