Pagini recente » Cod sursa (job #522930) | Cod sursa (job #578759) | Cod sursa (job #1886594) | Cod sursa (job #2227359) | Cod sursa (job #773459)
Cod sursa(job #773459)
#include <fstream>
#include <vector>
#define Nmax 100011
using namespace std;
int K[Nmax],N,Solve[Nmax],Dad[Nmax],Marked[Nmax];
vector<int> Leg[Nmax];
int St[Nmax],Size,Nod;
void Get( int Nod )
{
St[++Size]=Nod;
Solve[Nod]=Solve[ St[ Size - K[Nod] ] ]+1;
Marked[Nod]=1;
for (int i=0;i< int( Leg[Nod].size() ) ;++i)
if ( !Marked[Leg[Nod][i]] )
Get( Leg[Nod][i] );
St[Size--]=0;
}
ifstream F("cerere.in");
ofstream G("cerere.out");
int main()
{
F>>N;
if ( N==1 )
{
G<<"0\n";
return 0;
}
for (int i=1;i<=N;++i)
{
F>>K[i];
if ( !K[i] )
Solve[ i ]=-1;
}
for (int i=1;i<=N;++i)
{
int x,y;
F>>x>>y;
Dad[y]=x;
Leg[x].push_back(y);
}
for (int i=1;i<=N;++i)
if ( !Dad[i] )
Get(i);
for (int i=1;i<=N;++i)
G<<Solve[i]<<' ';
G<<'\n';
}