Cod sursa(job #2283854)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 15 noiembrie 2018 22:37:18
Problema Cerere Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#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();

            qu_back.push(RT[noda][0]);
        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;
}