Cod sursa(job #2502821)

Utilizator AndreeaGherghescuAndreea Gherghescu AndreeaGherghescu Data 1 decembrie 2019 17:31:16
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <iostream>
#include <fstream>

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];

void adauga (int x,int y)
{
    vf[++nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}
int stm (int x, int r)
{
    while (r)
    {
        x=parent[x];
        r--;
    }
    return x;
}
void dfs (int x)
{
    viz[x]=true;
    if (v[x]==0) d[x]=0;
    else d[x]=d[stm(x,v[x])]+1;
    for (int p=lst[x];p!=0;p=urm[p])
    {
        int y=vf[p];
        if (!viz[y])
        {
            dfs (y);
        }
    }
}
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;
}