Pagini recente » Cod sursa (job #2062628) | Cod sursa (job #1585988) | Cod sursa (job #1064131) | Cod sursa (job #2746694) | Cod sursa (job #2284701)
#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;
}