Cod sursa(job #2549272)

Utilizator ZahaZaharie Stefan Zaha Data 17 februarie 2020 15:20:54
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#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)
 */