Cod sursa(job #406548)

Utilizator cezyGrigore Cezar cezy Data 1 martie 2010 17:03:22
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
#include<vector>
using namespace std;
#define nmax 100005
#define pb push_back
vector<int> g[nmax];
int k[nmax],sol[nmax],c[nmax],viz[nmax],t[nmax];
int n;
void citire ()
{
	ifstream fin("cerere.in");
	fin>>n;
	int i,a,b;
	for(i=1;i<=n;i++)
		fin>>k[i];
	for(i=1;i<n;i++)
	{
		fin>>a>>b;
		g[a].pb(b);
		t[b]=a;
	}
	fin.close ();
}

void bfs (int nod)
{
	int i,inc,sf,x,q,poz;
	c[inc=sf=0]=nod;
	viz[nod]=1;
	while(inc<=sf)
	{
		x=c[inc];
		if(k[x]!=0)
		{
			q=x;
			poz=k[x];
			while(poz!=0) 
			{
				q=t[q];
				poz--;
			}
			sol[x]=sol[q]+1;
		}
		else
			sol[x]=0;
		inc++;
		for(i=0;i<g[x].size();i++)
			if(viz[g[x][i]]!=1)
				viz[g[x][i]]=1,c[++sf]=g[x][i];
	}
}
void dfs(int nod)
{
	int i,poz,q;
	if(k[nod]!=0)
		{
			q=nod;
			poz=k[nod];
			while(poz!=0) 
			{
				q=t[q];
				poz--;
			}
			sol[nod]=sol[q]+1;
		}
	else
			sol[nod]=0;
	viz[nod]=1;
	for(i=0;i<g[nod].size();i++)
		if(viz[g[nod][i]]!=1)
			dfs(g[nod][i]);
}
void scrie()
{
	int i;
	ofstream fout("cerere.out");
	for(i=1;i<=n;i++)
		fout<<sol[i]<<' ';
	fout.close();
}
int main ()
{
	citire ();
	int i;
	for(i=1;i<=n;i++)
		if(viz[i]!=1)
			dfs(i);
	scrie();
	return 0;
}