Cod sursa(job #2284718)

Utilizator skoda888Alexandru Robert skoda888 Data 17 noiembrie 2018 13:36:43
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb

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

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

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

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;
        }
    }

    int solutie[N + 1] = {};
    std::vector<int> present_sol;
    solutie[radacina] = 0;
    present_sol.push_back(radacina);
    DFS(Graf, tati, K, radacina, solutie, present_sol);

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