Cod sursa(job #2073877)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 23 noiembrie 2017 19:52:01
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <vector>
#include <bitset>
#define nmax 100002
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");

int pas[nmax];
int sol[nmax];
vector <int> graf[nmax];
bitset <nmax> viz;
int v2[nmax];
int v[nmax];
int z[nmax];
int pp[nmax];
int contor=0,vf=0;

void dfs()
{
    int nod=v[vf];
    v2[++contor]=nod;
    if(pas[nod])
    {
        pp[nod]=v[vf-pas[nod]];
    }
    for(int i=0;i<graf[nod].size();i++)
    {
        v[++vf]=graf[nod][i];
        dfs();
    }
    vf--;
}

int main()
{
    int n,x,y;
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>pas[i];
    }
    for(int i=1;i<n;i++)
    {
        fin>>x>>y;
        graf[x].push_back(y);
        viz[y]=1;
    }
    int radacina=0;
    for(int i=1;i<=n;i++)
    {
        if(!viz[i]){
            radacina=i;
            break;
        }
    }
    v[vf]=radacina;
    dfs();
    for(int i=1;i<=n;i++)
    {
        if(pas[v2[i]]==0)
            z[v2[i]]=0;
        else
            z[v2[i]]=1+z[pp[v2[i]]];
    }
    for(int i=1;i<=n;i++)
    {
        fout<<z[i]<<" ";
    }
    return 0;
}