Pagini recente » Cod sursa (job #2032219) | Cod sursa (job #382982) | Cod sursa (job #2123578) | Cod sursa (job #1413059) | Cod sursa (job #2549272)
#include <fstream>
#include <iostream>
using namespace std;
int targets[100005];
int parents[100005];
int find(int i, int reciever) {
if (reciever > 1) {
int temp = abs(find(parents[i], reciever - 1));
targets[i] = -temp;
return temp;
}
if (targets[i] <= 0) {
if (i == 0)
return 0;
else
return abs(targets[i]);
}
int temp = abs(find(parents[i], targets[i])) + 1;
targets[i] = -temp;
return temp;
}
int main() {
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> targets[i];
for (int i = 1; i < n; ++i) {
int x, y;
fin >> x >> y;
parents[y] = x;
}
for (int i = 1; i <= n; ++i) {
for (int i = 1; i <= n; ++i)
cout << targets[i] << " ";
cout << "\n";
if (targets[i] <= 0)
fout << abs(targets[i]) << " ";
else
fout << find(i, targets[i]) << " ";
}
return 0;
}
/*
*Idee: iau fiecare nod si ii parcurg stramosul cu dfs pana dau de un 0.
*Ies din dfs si adaug la fiecare stramos numarul de parcurrgeri (anterior + 1)
*/