Pagini recente » Cod sursa (job #549427) | Cod sursa (job #607669) | Cod sursa (job #2302596) | Cod sursa (job #1222663) | Cod sursa (job #990346)
Cod sursa(job #990346)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define Nmax 100005
vector <int> G[Nmax];
int wise[Nmax];
int answer[Nmax];
int degree[Nmax];
int use[Nmax];
int stiva[Nmax];
int N, R, vf;
void read()
{
ifstream f("cerere.in");
f >> N;
for ( int i = 1; i <= N; ++i )
f >> wise[i];
for ( int i = 1; i < N; ++i )
{
int a, b;
f >> a >> b;
G[a].push_back( b );
degree[b]++;
}
f.close();
}
void init()
{
for ( int i = 1; i <= N; ++i )
if ( degree[i] == 0 )
R = i;
}
void DFS( int nod )
{
stiva[ vf = 1 ] = nod;
while( vf )
{
int nod = stiva[vf];
if ( use[nod] == (int)G[nod].size() )
vf--;
else
{
int son = G[nod][ use[nod]++ ];
stiva[ ++vf ] = son;
if ( wise[son] )
answer[son] = answer[ stiva[ vf - wise[son] ] ] + 1;
}
}
}
void print()
{
ofstream g("cerere.out");
for ( int i = 1; i <= N; ++i )
g << answer[i] << " ";
g << "\n";
g.close();
}
int main()
{
read();
init();
DFS( R );
print();
return 0;
}