Pagini recente » Cod sursa (job #1909569) | Cod sursa (job #1878757) | Cod sursa (job #164845) | Cod sursa (job #1887785) | Cod sursa (job #2454768)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
int v[100000+7];
int tata[100000+7];
int len[100000+7];
int st[100000+7];
int f[100000+7];
int st_len = 0;
vector< int > g[100000+7];
void dfs1(int poz) {
tata[poz] = st[st_len - v[poz]];
st[st_len] = poz;
st_len++;
/*for(int i = 0; i < st_len; i++) {
cout << st[i] << " ";
}
cout << endl << poz << " " << tata[poz] << endl;*/
for(int i = 0; i < g[poz].size(); i++) {
dfs1(g[poz][i]);
}
st_len--;
}
int dfs(int poz) {
if(len[poz] != -1) return len[poz];
int track = poz;
track = tata[track];
len[poz] = dfs(track) + 1;
return len[poz];
}
int main()
{
int n, x, y; cin >> n;
for(int i = 0; i < n; i++) {
cin >> v[i];
len[i] = -1;
if(v[i] == 0) len[i] = 0;
}
int start;
for(int i = 1; i < n; i++) {cin >> x >> y; g[x-1].push_back(y-1); f[y-1] = 1; }
for(int i = 0; i < n; i++) {
if(f[i] == 0) start = i;
}
st[0] = start;
dfs1(start);
for(int i = 0; i < n; i++)
cout << dfs(i) << " ";
}