Pagini recente » Cod sursa (job #205920) | Cod sursa (job #596890) | Cod sursa (job #494299) | Cod sursa (job #991098) | Cod sursa (job #2284718)
#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;
}