Pagini recente » Cod sursa (job #1464707) | Cod sursa (job #1023023) | Cod sursa (job #939922) | Cod sursa (job #2699104) | Cod sursa (job #2283851)
#include <bits/stdc++.h>
#define Dim 100006
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
vector < int > Vf[Dim],RT[Dim];
queue < int > qu,qu_back;
int N,a,b,G[Dim],Grad[Dim],Dist[Dim];
int rad;
void BFS_back(int varf)
{
int cnt=0;
qu_back.push(varf);
while(Dist[varf]!=cnt)
{
int noda=qu_back.front();
qu_back.pop();
for(int i=0;i<RT[noda].size();i++)
qu_back.push(RT[noda][i]);
cnt++;
}
G[varf]=G[qu_back.front()]+1;
//cout<<varf<<" "<<qu_back.front()<<" "<<G[varf]<<" "<<G[qu_back.front()]<<" "<<Dist[varf]<<'\n';
qu_back.pop();
}
void BFS()
{
qu.push(rad);
while(!qu.empty())
{
int nod=qu.front();
qu.pop();
if(Dist[nod])
BFS_back(nod);
else
G[nod]=0;
for(int i=0;i<Vf[nod].size();i++)
qu.push(Vf[nod][i]);
}
}
int main()
{
f>>N;
for(int i=1;i<=N;i++) f>>Dist[i];
for(int i=1;i<=N;i++)
{
f>>a>>b;
Grad[b]+=1;
Vf[a].push_back(b);
RT[b].push_back(a);
}
bool stop=0;
for(int i=1;i<=N&&stop==0;i++)
if(Grad[i]==0)
{
stop=1;
rad=i;
}
Grad[rad]=1;
BFS();
for(int i=1;i<=N;i++) g<<G[i]<<" ";
return 0;
}