Pagini recente » Cod sursa (job #2564670) | Cod sursa (job #1315099) | Cod sursa (job #1365299) | Cod sursa (job #930023) | Cod sursa (job #1368961)
#include <iostream>
#include <cstdio>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
const int MAXN = 100000, INF = 200000000;
int T[MAXN+1], level[MAXN+1], sol[MAXN+1], K[MAXN+1], N, root[MAXN+1];
vector <int> G[MAXN+1];
void citire()
{
//scanf("%d",&N);
in>>N;
for(int i = 1; i <= N; i++)
{
//scanf("%d",&K[ i ]);
in>>K[ i ];
if( K[ i ] == 0 )
sol[ i ] = 0;
else sol[ i ] = INF;
}
for(int i = 1; i <= N - 1; i++)
{
int a, b; //scanf("%d %d",&a,&b);
in>>a>>b;
G[ a ].push_back( b );
root[ b ] = 1;
}
}
void testCitire()
{
for(int i = 1; i <= N; i++)
{
cout<<i<<" ";
for(int j = 0; j < G[ i ].size(); j++)
cout<<G[ i ][ j ]<<' ';
cout<<endl;
}
}
vector <int> drum;
void dfs(int nod)
{
/*
if( G[ nod ].size() == 0 )
{
for(int i = 0; i < drum.size(); i++)
cout<<drum[ i ]<<' ';
cout<<endl;
}*/
for(int i = 0; i < G[ nod ].size(); i++)
{
int next = G[ nod ][ i ];
drum.push_back( next );
if( sol[ next ] != 0 )
sol[ next ] = 1 + sol[ drum[ drum.size() - K[ next ] - 1 ] ];
dfs( next );
drum.pop_back();
}
}
int main()
{
//freopen("cerere.in","r",stdin);
//freopen("cerere.out","w",stdout);
citire();
for(int i = 1; i <= N; i++)
if( root[ i ] == 0 )
{
drum.push_back( i );
sol[ i ] = 0;
dfs( i );
break;
}
for(int i = 1; i <= N; i++)
//printf("%d ",sol[ i ]);
out<<sol[ i ]<<' ';
return 0;
//testCitire();
}