Cod sursa(job #1036007)

Utilizator LizzardStanbeca Theodor-Ionut Lizzard Data 18 noiembrie 2013 22:13:51
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
using namespace std;

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

struct nod
{
    int info;
    nod *next;
};

nod *l[100001];
void dfs(int ),push(int ),push(int , int );
char c[100001];
bool viz[100001];
int n,vf,s[100001],v[100001],sol[100001];

int main()
{
    int i,a,b,root;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=1;i<n;i++)
    {
        fin>>a>>b;
        push(a,b);
        c[b]=1;
    }
    for(i=1;i<=n;i++)
        if(c[i]==0)
        {
            root=i;
            break;
        }
    push(root);
    dfs(root);

    for(i=1;i<=n;i++)
        fout<<sol[i]<<" ";
    return 0;
}

void dfs(int x)
{
    viz[x]=true;
    push(x);
    if(v[x]==0)
        sol[x]=0;
    else
        sol[x]=sol[s[vf-v[x]]]+1;

    for(nod *nc=l[x];nc!=NULL;nc=nc->next)
    {
        if(!viz[nc->info])
            dfs(nc->info);
    }
    s[vf]=0;
    vf--;
}

void push(int x, int y)
{
    nod *nc=new(nod);
    nc->info=y;
    nc->next=l[x];
    l[x]=nc;
}

void push(int a)
{
    vf++;
    s[vf]=a;
}