Pagini recente » Cod sursa (job #2524568) | Cod sursa (job #2361485) | Cod sursa (job #52469) | Cod sursa (job #2492298) | Cod sursa (job #1092253)
#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;
}