Cod sursa(job #1092253)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 26 ianuarie 2014 19:37:31
Problema Cerere Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

#define NMAX 100001

vector <int> v[NMAX],v2[NMAX];
int k[NMAX],viz[NMAX],gr[NMAX],dfn[NMAX];

inline void dfs(int nod, int lev)
{
	if(k[nod])
		k[nod]=dfn[lev-k[nod]];
	dfn[lev]=nod;
	for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++) 
		dfs(*it,lev+1);
}

inline void dfs2(int nod, int lev)
{
	viz[nod]=1;
	k[nod]=lev;
	for(vector <int> :: iterator it=v2[nod].begin();it!=v2[nod].end();it++)
		dfs2(*it,lev+1);
}
	
int main ()
{
	int n,i,x,y,rad;
	ifstream f("cerere.in");
	ofstream g("cerere.out");
	f>>n;
	for(i=1;i<=n;i++)
		f>>k[i];
	for(i=1;i<=n-1;i++) {
		f>>x>>y;
		v[x].push_back(y);
		gr[y]++;
	}
	f.close();
	for(rad=1;gr[rad]!=0;rad++);
	dfs(rad,0);
	for(i=1;i<=n;i++) 
		if(k[i])
			v2[k[i]].push_back(i);
	for(i=1;i<=n;i++)
		if(viz[i]==0)
			dfs2(i,0);
	for(i=1;i<=n;i++)
		g<<k[i]<<" ";
	g.close();
	return 0;
}