Cod sursa(job #1092259)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 26 ianuarie 2014 19:43:51
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<stdio.h>
using namespace std;

#define NMAX 100001
#define DIM 10001

vector <int> v[NMAX],v2[NMAX];
int k[NMAX],viz[NMAX],gr[NMAX],dfn[NMAX],poz;
char buff[DIM];

void citeste(int &x)
{
	while(buff[poz]<'0' || buff[poz]>'9')
		if(++poz==DIM) {
			fread(buff,1,DIM,stdin);
			poz=0;
		}
	x=0;
	while(buff[poz]>='0' && buff[poz]<='9') {
		x=x*10+buff[poz]-'0';
		if(++poz==DIM) {
			fread(buff,1,DIM,stdin);
			poz=0;
		}
	}
}

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;
	freopen ("cerere.in","r",stdin);
	ofstream g("cerere.out");
	citeste(n);
	for(i=1;i<=n;i++)
		citeste(k[i]);
	for(i=1;i<=n-1;i++) {
		citeste(x);
		citeste(y);
		v[x].push_back(y);
		gr[y]++;
	}
	fclose(stdin);
	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;
}