Cod sursa(job #2284701)

Utilizator skoda888Alexandru Robert skoda888 Data 17 noiembrie 2018 12:55:58
Problema Cerere Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb

#include <iostream>
#include <fstream>
#include <vector>

std::ofstream out("cerere.out");

int determina_nivelul_inteligentului(int nod, int K[], int tati[], int solutie[]){
    //std::cout << '*';
    int stramos = nod;
    for(int i = 1; i <= K[nod]; ++i){
        stramos = tati[stramos];
    }
    return 1 + solutie[stramos];
}

//un DFS normal, in parcursul caruia descopar numarul de stramosi prin care trece cererea
void DFS(std::vector<int> Graf[], int tati[], bool viz[], int K[], int radacina, int solutie[]){
    for(int i = 0; i < Graf[radacina].size(); ++i){
        if(K[Graf[radacina][i]] == 0){
            solutie[Graf[radacina][i]] = 0;
            //std::cout << solutie[Graf[radacina][i]] << ' ';
        }
        else{
            solutie[Graf[radacina][i]] = determina_nivelul_inteligentului(Graf[radacina][i], K, tati, solutie);
            //std::cout << solutie[Graf[radacina][i]] << ' ';
        }
        DFS(Graf, tati, viz, K, Graf[radacina][i], solutie);
    }
}

int main()
{
    std::ifstream in("cerere.in");

    int N;
    in >> N;

    int K[N + 1];
    for(int i = 1; i <= N; ++i){
        in >> K[i];
    }

    int tati[N + 1] = {};
    std::vector<int> Graf[N + 1];
    int tata, fiu;
    while(in >> tata >> fiu){
        tati[fiu] = tata;
        Graf[tata].push_back(fiu);
    }

    int radacina;
    for(int i = 1; i <= N; ++i){
        if(tati[i] == 0){
            radacina = i;
            break;
        }
    }

    bool viz[N + 1] = {};
    int solutie[N + 1] = {};
    solutie[radacina] = 0;
    DFS(Graf, tati, viz, K, radacina, solutie);

    for(int i = 1; i <= N; ++i){
        out << solutie[i] << ' ';
    }
    return 0;
}