Pagini recente » Cod sursa (job #890267) | Cod sursa (job #1274013) | Cod sursa (job #3172906) | Cod sursa (job #663696) | Cod sursa (job #2553787)
#include <fstream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <set>
#include <map>
#include <string.h>
#include <queue>
#include <stack>
#define INF 0x3f3f3f3f
using namespace std;
#ifdef DEBUG
string name = "data";
#else
string name = "cerere";
#endif
ifstream fin(name + ".in");
ofstream fout(name + ".out");
#define MAXN 100005
int n;
int c[MAXN];
vector<int> g[MAXN];
vector<int> gt[MAXN];
int parent[MAXN];
int st[MAXN];
int cnt[MAXN];
void dfs(int node, int lvl) {
if (c[node] == 0) {
parent[node] = 0;
} else {
parent[node] = st[lvl - c[node]];
}
for (auto y: g[node]) {
st[lvl] = node;
dfs(y, lvl + 1);
}
}
int count(int node) {
if (cnt[node] != INF) {
return cnt[node];
}
if (parent[node] == 0) {
return 0;
}
int rez = 1 + count(parent[node]);
cnt[node] = rez;
return rez;
}
int k = 0;
int nextNumber(string &s) {
while (s[k] == ' ' || s[k] == '\n') {
k++;
}
int rez = 0;
while (s[k] >= '0' && s[k] <= '9') {
rez *= 10;
rez += s[k] - '0';
k++;
}
return rez;
}
int main() {
fin >> n;
memset(cnt, 0x3f, sizeof(cnt));
string s((istreambuf_iterator<char>(fin)), (istreambuf_iterator<char>()));
for (int i = 1; i <= n; ++i) {
c[i] = nextNumber(s);
}
for (int i = 1; i < n; ++i) {
int x = nextNumber(s);
int y = nextNumber(s);
g[x].push_back(y);
gt[y].push_back(x);
}
int boss = 0;
for (int i = 1; i <= n; ++i) {
if (gt[i].size() == 0) {
boss = i;
}
}
dfs(boss, 0);
for (int i = 1 ; i<= n; ++i) {
fout << count(i) << " ";
}
return 0;
}