Cod sursa(job #2573212)

Utilizator danbesuDan Besu danbesu Data 5 martie 2020 16:29:56
Problema Cerere Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;

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

const int nmax = 100001;
int n;
bool este_tata[nmax], viz[nmax];
vector<int>k;
vector<int>drumuri[nmax];
int tt[nmax];

void umplere(int nod){
    viz[nod] = true;
    int tata = tt[nod];

    if(tata == 0){
        return;
    }
    if(viz[tata] == true){

        drumuri[nod].push_back(tata);
        for(int i = 0; i < drumuri[tata].size(); ++i){
            drumuri[nod].push_back( drumuri[tata][i] );
        }
        return;
    }

    umplere(tata);
    drumuri[nod].push_back(tata);
    for(int i = 0; i < drumuri[tata].size(); ++i){
        drumuri[nod].push_back( drumuri[tata][i] );
    }
}

int main(){

    in>>n;
    int a = 0; k.push_back(a);
    for(int i = 1; i <= n; ++i){
        in>>a; k.push_back(a);
    }
    for(int i = 1; i < n; ++i){
        int b; in>>a>>b;
        tt[b] = a;
        este_tata[a] = true;
    }

    for(int i = 1; i <=n; ++i){
        if(este_tata[i] == 0){
            umplere(i);
        }
    }

    /*for(int i = 1; i <= n; ++i){
        out<<i<<"- ";
        for(int j = 0; j < drumuri[i].size(); ++j)
            out<<drumuri[i][j]<<' ';
        out<<'\n';
    }*/

    out<<0<<' ';
    for(int i = 2; i <= n; ++i){
        int nr = 0, kk = k[i];
        if( kk == 0 ){
            out<<0<<' ';
            continue;
        }
        for(int j = -1 + kk; j < drumuri[i].size(); j += kk ){
            int stramos = drumuri[i][j];
            if(k[stramos] == 0){
                nr++;
                break;
            }
            else{
                kk = k[stramos];
                nr++;
            }
        }
        out<<nr<<' ';
    }





    in.close();
    out.close();
    return 0;
}