Cod sursa(job #1076579)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 10 ianuarie 2014 13:18:01
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<fstream>
#include<vector>
using namespace std;
int rad,k[100005],t[100005],g[100005],rasp[100005],x,y,n,parc[100005];
ifstream in("cerere.in"); ofstream out("cerere.out");
vector <int> l[100005];
int maimuta(int nod){
    if(nod==rad || k[nod]==0) return 0;
    int crt=nod,nr=0,drum=0;
    while(nod!=rad && k[nod]!=0){
        crt=nod;
        parc[++nr]=nod;
        ++drum;
        for(int i=1;i<=k[nod];++i) crt=t[crt];
        nod=crt;
        if(rasp[nod]!=0) {drum+=rasp[nod]; break;}
    }
    for(int i=1;i<=nr;++i)
        rasp[parc[i]]=drum-i+1;
    return rasp[parc[1]];
}
int main(){
    in>>n;
    for(int i=1;i<=n;++i) in>>k[i];
    for(int i=1;i<n;++i){
        in>>x>>y;
        g[y]++;
        t[y]=x;
        l[x].push_back(y); l[y].push_back(x);
    }
    for(int i=1;i<=n;++i) if(g[i]==0) rad=i;
    for(int i=1;i<=n;++i)
        out<<maimuta(i)<<' ';
    out<<'\n';
    return 0;
}