Pagini recente » Cod sursa (job #1019638) | Cod sursa (job #3183465) | Cod sursa (job #2111513) | Cod sursa (job #2931419) | Cod sursa (job #1250304)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
vector <int> v[100001];
vector <int> arb[100001];
vector <int> viz(100001, 0);
vector <int> niv(100001, 0);
vector <int> sol(100001, 0);
void dfs(int top, int *a, int n)
{
viz[top] = 1;
n++;
niv[n] = top;
if (a[top] != 0) arb[niv[n - a[top]]].push_back(top);
//if (a[top] != 0 && n - a[top] >= 0)
//sol[top] = sol[niv[n - a[top]]] + 1;
for (int i = 0; i < v[top].size(); i++)
if (viz[v[top][i]] == 0)
dfs(v[top][i], a, n);
//for (int i = 0; i <= 12; i++) cout << niv[i] << " "; cout << "\n";
niv[n] = 0;
}
void bfs(int x){
queue <int> q;
q.push(x);
viz[x] = 1;
while (!q.empty()){
//cout << q.front() << " ";
for (int i = 0; i < arb[q.front()].size(); i++)
if (viz[arb[q.front()][i]] == 0) {
q.push(arb[q.front()][i]);
sol[arb[q.front()][i]] = sol[q.front()]+1;
viz[arb[q.front()][i]] = 1;
}
q.pop();
}
}
int main()
{
ifstream f("cerere.in");
ofstream g("cerere.out");
int n, i, j;
f >> n;
int *a = new int[n + 1];
for (i = 1; i <= n; i++) {
f >> a[i];
}
while (!f.eof()) {
f >> i >> j;
v[i].push_back(j);
}
dfs(1, a, -1);
/*
for (i = 1; i <= n; i++){
cout << i << ": ";
for (j = 0; j < arb[i].size(); j++)
cout << arb[i][j] << " ";
cout << endl;
}
*/
for (i = 0; i <= n; i++) viz[i] = 0;
for (i = 1;i<=n;i++)
if (a[i]==0) bfs(i);
for (int i = 1; i <= n; i++)
g << sol[i] << " ";
//cin.get();
f.close();
g.close();
return 0;
}