Cod sursa(job #502175)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 17 noiembrie 2010 23:27:23
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
#include<list>
#define NMAX 100003

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

list<int> a[NMAX];
int n, k[NMAX], t[NMAX], st, viz[NMAX], pp[NMAX];

struct coada
{
	int nod, prec;
}c[NMAX];

void citeste()
{
	int i, x, y;
	f>>n;
	for (i=1; i<=n; ++i) f>>k[i];
	for (i=1; i<n; ++i)
	{
		f>>x>>y;
		t[y]=x;
		a[x].push_back(y);
	}
	for (i=1; i<=n; ++i)
		if (t[i]==0) {st=i; break;}
}

void bfs()
{
	int p=1, u=1, z;
	list<int> :: iterator it;
	c[1].nod=st;viz[st]=1;
	while (p<=u)
	{
		z=c[p].nod;
		for (it=a[z].begin(); it!=a[z].end(); ++it)
		{
			c[++u].nod=*it;c[u].prec=p; viz[*it]=u;
		}
		++p;
	}
}

void precedenta()
{
	int i, niv, nod, j;
	for (i=1; i<=n; ++i)
	{
		niv=0;j=viz[i];
		while (niv<k[i])
		{
			j=c[j].prec;
			++niv;
		}
		pp[i]=c[j].nod;
	}
}			

void solve()
{
	int i, j, val;
	
	for (i=1; i<=n; ++i)
	{
		j=pp[i];
		if (j==i) val=0;
		else 
		{
			val=1;
			while (k[j]!=0) 
				{
					j=pp[j];
					++val;
				}
		}
		g<<val<<" ";
	}
}
	
int main()
{
	citeste();
	bfs();
	precedenta();
	solve();
	f.close();
	g.close();
	return 0;
}