Cod sursa(job #1853076)

Utilizator GoogalAbabei Daniel Googal Data 21 ianuarie 2017 13:48:10
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>
#include <cstring>
#define nmax 100001

using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n,par[nmax],v[nmax],n1,stiva[nmax],k[nmax],vf;
bool viz[nmax];

vector < int > leg[nmax];

inline void read()
{
    int i,a,b;
    fin>>n;
    for(i=1; i<=n; i++)
        fin>>v[i];
    for(i=1; i<=n; i++)
    {
        fin>>a>>b;
        viz[b]=true;
        par[b]=a;
        leg[a].push_back(b);
    }

    fin.close();

    for(i=1; i<=n; i++)
        if(viz[i]==false)
        {
            n1=i;
            break;
        }
    if(v[n1])
        v[n1]=0;
}

void DFS(int x)
{
    int i;
    viz[x]=true;
    if(v[x])
        k[x]=stiva[vf-v[x]+1];
    stiva[++vf]=x;
    for(i=0; i<leg[x].size(); i++)
    {
        if(!viz[leg[x][i]])
        {
            DFS(leg[x][i]);
            while(stiva[vf]!=x)
                vf--;
        }
    }
}

int no(int x)
{
    if(!k[x])
        return 1;
    else
        return 1+no(k[x]);
}

inline void write()
{
    int nr,x;
    for(int i=1; i<=n; i++)
    {
        if(!v[i])
            fout<<"0 ";
        else
            fout<<no(k[i])<<' ';
    }
    fout.close();
}

int main()
{
    read();
    memset(viz, false, nmax);
    DFS(n1);
    write();
    return 0;
}