Pagini recente » Cod sursa (job #2276288) | Cod sursa (job #1023593) | Cod sursa (job #1359973) | Cod sursa (job #2711238) | Cod sursa (job #1338437)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int N;
int maimuta[100005], rad, sol[100005];
vector<int> V[100005];
int ST[100005], top;
bool used[100005], gr[100005];
void dfs(int nod)
{
for (vector<int>::iterator it = V[nod].begin(); it != V[nod].end(); ++it)
{
if (!used[*it])
{
used[*it] = true;
if (maimuta[*it] == 0)
sol[*it] = 0;
else
sol[*it] = sol[ST[top - maimuta[*it] + 1]] + 1;
ST[++top] = *it;
dfs(*it);
--top;
}
}
}
int main()
{
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> maimuta[i];
for (int i = 1, nod1, nod2; i <= N; ++i)
{
fin >> nod1 >> nod2;
gr[nod2] = true;
V[nod1].push_back(nod2);
}
for (int i = 1; i <= N && !rad; ++i)
if (!gr[i])
rad = i;
ST[++top] = rad;
dfs(rad);
for (int i = 1; i <= N; ++i)
fout << sol[i] << ' ';
fin.close();
fout.close();
return 0;
}