Cod sursa(job #1678383)

Utilizator greenadexIulia Harasim greenadex Data 7 aprilie 2016 11:46:45
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <bits/stdc++.h>

#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair
 
using namespace std;
 
const string name = "cerere",
             in_file = name + ".in",
             out_file = name + ".out";
 
ifstream fin(in_file);
ofstream fout(out_file);
 
const int MAX = 1e5 + 5;

vector<int> tree[MAX];
int val[MAX], str[MAX], rez[MAX], in[MAX];
int n;

void dfs(int node, int level) {
	for (auto child : tree[node]) {
		str[level] = child;
		rez[child] = rez[str[level - val[child]]] + (val[child] == 0 ? 0 : 1);
		dfs(child, level + 1);
	}
}

int main() {
	fin >> n;
	for (int i = 1; i <= n; i++)
		fin >> val[i];

	for (int a, b, i = 1; i <= n - 1; i++) {
		fin >> a >> b;
		tree[a].pb(b);
		in[b]++;
	}

	int root = -1;
	for (int i = 1; i <= n; i++)
		if (!in[i]) {
			root = i;
			break;
		}

	str[0] = root;
	rez[root] = 0;
	dfs(root, 1);

	for (int i = 1; i <= n; i++)
		fout << rez[i] << ' ';
	return 0;
}