Pagini recente » Cod sursa (job #59767) | Cod sursa (job #2665542) | Cod sursa (job #2585695) | Cod sursa (job #1124988) | Cod sursa (job #1192082)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("cerere.in");
ofstream os("cerere.out");
int N, x, y;
int V[100001];
vector <int> G[100001];
int Stack[100001];
int R[100001];
bool Vis[100001];
void Input();
void DF();
void Output();
int main()
{
Input();
DF();
Output();
is.close();
os.close();
}
void Input()
{
is >> N;
for ( int i = 1; i <= N; ++i )
{
is >> x;
V[i] = x;
}
for ( int i = 1; i <= N-1; ++i )
{
is >> x >> y;
Vis[y] = true;
G[x].push_back(y);
}
}
void DF()
{
int it(1);
for ( int i = 1; i <= N; ++i )
{
if ( Vis[i] == false )
{
Stack[it] = i;
Vis[i] = true;
}
else
Vis[i] = false;
}
while ( it )
{
x = Stack[it];
if ( V[x] )
R[x] = 1 + R[Stack[it-V[x]]];
y = -1;
for ( int i = 0; i < G[x].size() ; ++i )
{
if ( Vis[G[x][i]] == false )
{
y = 1; it++;
Stack[it] = G[x][i];
Vis[G[x][i]] = true;
i = 10000000000;
}
}
if ( y == -1 )
it--;
}
}
void Output()
{
for ( int i = 1; i <= N; ++i )
os << R[i] << " ";
}