Pagini recente » Cod sursa (job #1002431) | Cod sursa (job #2283274) | Cod sursa (job #43845) | Cod sursa (job #584844) | Cod sursa (job #1726258)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 100000
struct Nod
{
int kstramos;
int tata;
vector<int> fii;
};
Nod noduri[NMAX + 1];
int distantaCerere[NMAX + 1];
vector<int> stiva;
void determinaDistante(int radacina);
void determinaStramosi(int nod);
int main()
{
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> noduri[i].kstramos;
for (int i = 1; i < n; ++i) {
int x, y;
fin >> x>> y;
noduri[x].fii.push_back(y);
noduri[y].tata = x;
}
int radacina = 0;
for (int i = 1; i <= n && radacina == 0; ++i)
if (noduri[i].tata == 0)
radacina = i;
determinaStramosi(radacina);
determinaDistante(radacina);
for (int i = 1; i <= n; ++i)
fout << distantaCerere[i] << " ";
return 0;
}
void determinaDistante(int radacina)
{
queue<int> q;
q.push(radacina);
while (!q.empty()) {
int nod = q.front();
q.pop();
if (noduri[nod].kstramos == 0)
distantaCerere[nod] = 0;
else distantaCerere[nod] = distantaCerere[noduri[nod].kstramos] + 1;
for (int fiu : noduri[nod].fii)
q.push(fiu);
}
}
void determinaStramosi(int nod)
{
stiva.push_back(nod);
for (int fiu : noduri[nod].fii) {
if (noduri[fiu].kstramos != 0)
noduri[fiu].kstramos = stiva[stiva.size() - noduri[fiu].kstramos];
determinaStramosi(fiu);
}
stiva.pop_back();
}