Cod sursa(job #406577)

Utilizator cezyGrigore Cezar cezy Data 1 martie 2010 17:30:06
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 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],cnt,back[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];
	}
	fin.close ();
}
void dfs(int nod)
{
	int i;
	viz[nod]=1;
	back[++cnt] = nod;
	if(k[nod]==0)
	{
		sol[nod]=0;
	}
	else
	{
		sol[nod] = sol[back[cnt -k[nod]]] + 1;
	}
	for(i=0;i<g[i].size();i++)
		if(!viz[g[nod][i]])
			dfs(g[nod][i]);
	cnt--;
}
	
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++)
	{
		cnt=0;
		if(!t[i])
			dfs(i);
	}
	scrie();
	return 0;
}