Cod sursa(job #268621)

Utilizator andr33aradu ioana andr33a Data 1 martie 2009 15:55:34
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include<fstream.h>
#define nmax 300000
ifstream f("cerere.in");
ofstream g("cerere.out");
struct lista
{
	long inf;
	lista *urm;
}*a[nmax];
long st[nmax],viz[nmax],n,c[nmax],x,y,s[nmax],nr;
void citire()
{
	long i;
	f>>n;
	for(i=1;i<=n;i++)
		f>>c[i];
	for(i=1;i<=n;i++)
	{
		f>>x>>y;
		lista *q=new lista;
		q->inf=y;
		q->urm=a[x];
		a[x]=q;
	}
}
long sol(long i,long nr)
{
	while(c[st[i]]!=0)
	{
		nr++;
		i=i-c[st[i]];
	}
	return nr;
}

void solutie(long vf,long i)
{
	st[i]=vf;
	s[vf]=sol(i,0);
	viz[vf]=1;
	lista *q=a[vf];
	while(q)
	{
		if(viz[q->inf]==0)
			solutie(q->inf,i+1);
		q=q->urm;
	}
	
}
int main()
{
	citire();
    long i;
	for(i=1;i<=n;i++)
		if(viz[i]==0)
			solutie(i,1);
	for(i=1;i<=n;i++)
		g<<s[i]<<" ";
f.close();
g.close();
return 0;
}