Pagini recente » Cod sursa (job #127582) | Cod sursa (job #664751) | Cod sursa (job #1762721) | Cod sursa (job #1680470) | Cod sursa (job #1092259)
#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;
}