Cod sursa(job #2502828)

Utilizator AndreeaGherghescuAndreea Gherghescu AndreeaGherghescu Data 1 decembrie 2019 17:38:37
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

const int N=100001;
int lst[N],urm[N*2],vf[N*2],v[N],d[N],n,nr,f[N],parent[N];
bool viz[N];
vector <int> stm;

void adauga (int x,int y)
{
    vf[++nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}

void dfs (int x)
{
    viz[x]=true;
    if (v[x]==0) d[x]=0;
    else
    {
        int stram=stm[stm.size()-v[x]];
        d[x]=d[stram]+1;
    }
    stm.push_back(x);
    for (int p=lst[x];p!=0;p=urm[p])
    {
        int y=vf[p];
        if (!viz[y])
            dfs (y);
    }
    stm.pop_back();
}
int main()
{
    int n,p,x,y;
    in>>n;
    for (int i=1;i<=n;i++)
        in>>v[i];
    for (int i=1;i<n;i++)
    {
        in>>x>>y;
        adauga (x,y);
        adauga (y,x);
        f[y]++;
        parent[y]=x;
    }
    for (int i=1;i<=n;i++)
        if (f[i]==0)
        {
            p=i;
            break;
        }
    dfs (p);
    for (int i=1;i<=n;i++)
        out<<d[i]<<' ';
    return 0;
}