Pagini recente » Cod sursa (job #2688244) | Cod sursa (job #1080483) | Cod sursa (job #1736517) | Cod sursa (job #1732019) | Cod sursa (job #1744249)
#include <bits/stdc++.h>
#define Nmax 100002
#define pb(x) push_back(x)
FILE *fin = freopen("cerere.in", "r", stdin);
FILE *fout = freopen("cerere.out", "w", stdout);
using namespace std;
int n, K[Nmax], sol[Nmax], root, stk[Nmax];
bitset <Nmax> vis, no_root;
vector <int> G[Nmax];
void Find_Root()
{
for(int i = 1; i <= n; ++ i)
if(!no_root.test(i))
{
root = i;
break;
}
}
void DFS(int x)
{
int pos = stk[0];
if(!K[x])
sol[x] = 0;
else
sol[x] = sol[stk[pos - K[x]]] + 1;
vis.set(x);
for(int i = 0; i < G[x].size(); ++ i)
{
int y = G[x][i];
if(!vis.test(y))
{
stk[++ stk[0]] = y;
DFS(y);
}
}
-- stk[0];
}
void write()
{
for(int i = 1; i <= n; ++ i)
printf("%d ", sol[i]);
printf("\n");
}
int main()
{
int i, k, node, x, y, p;
scanf("%d", &n);
for(i = 1; i <= n; ++ i)
scanf("%d", &K[i]);
for(i = 1; i <= n; ++ i)
{
scanf("%d %d", &x, &y);
no_root.set(y);
G[x].pb(y);
}
Find_Root();
stk[++ stk[0]] = root;
DFS(root);
write();
return 0;
}