Cod sursa(job #1245296)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 18 octombrie 2014 21:52:29
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <fstream>
#include <bitset>
#include <list>
#define DIM 100011
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int n;
int K[DIM],sol[DIM],S[DIM];

list<int> L[DIM];
bitset<DIM> viz;

void dfs(int nod){
    list<int>::iterator it;
    viz[nod]=true;
    S[++S[0]]=nod;
    if(K[nod])
        sol[nod]=1+sol[S[S[0]-K[nod]]];
    for(it=L[nod].begin();it!=L[nod].end();it++){
        if(!viz[*it])
            dfs(*it);
    }
    S[0]--;
}

int main(void){
    register int st,i,j,x,y;

    f>>n;
    for(i=1;i<=n;i++) f>>K[i];
    for(i=1;i<n;i++)
        f>>x>>y,L[x].push_back(y),viz[y]=1;
    for(i=1;i<=n;i++) if(!viz[i]) st=i;
    viz.reset();
    dfs(st);

    for(i=1;i<=n;i++)
        g<<(K[i]==0?0:sol[i])<<" ";
    f.close();
    g.close();
    return 0;
}