Cod sursa(job #1077870)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 11 ianuarie 2014 18:54:09
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include<fstream>
#include<vector>
using namespace std;
int rad,k[100005],x,y,n,str[100005],st[100005],g[100005];
ifstream in("cerere.in"); ofstream out("cerere.out");
vector <int> l[100005];
void dfs(int nod){
    st[++st[0]]=nod;
    str[nod]=st[st[0]-k[nod]];
    for(vector <int> :: iterator it=l[nod].begin(); it!=l[nod].end();++it)
        dfs(*it); //in str[i] am stramosul in care mergem direct din i
    st[0]--;
}
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]++;
        l[x].push_back(y);
    }
    for(int i=1;i<=n;++i) if(g[i]==0) rad=i;
    dfs(rad);
    for(int i=1;i<=n;++i){
        int ans=0,nod=i;
        while(k[nod]!=0) nod=str[nod],++ans;
        out<<ans<<' ';
    }
    out<<'\n';
    return 0;
}