Cod sursa(job #2822825)

Utilizator lolismekAlex Jerpelea lolismek Data 25 decembrie 2021 18:51:59
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

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

const int N = 1e5 + 1;
bitset <N> viz;
vector <int> adj[N];
vector <int> ramura;
int v[N], rasp[N];

void dfs(int nod){
    viz[nod] = 1;
    ramura.push_back(nod);
    for(auto vec : adj[nod]){
        if(!viz[vec]){			
            if(v[vec] == 0){
				rasp[vec] = 0;
            }else{
                //cout << ">>> " << vec << " " << ramura.size() << " " << v[vec] << endl;
			    if((int)ramura.size() >= v[vec])
			    	rasp[vec] = rasp[ramura[ramura.size() - v[vec]]] + 1;
			}
            dfs(vec);
            ramura.pop_back();
        }
    }
}

int main(){
    int n;
    fin >> n;
    for(int i = 1; i <= n; i++) fin >> v[i];
    for(int i = 1; i < n; i++){
        int a, b;
        fin >> a >> b;
        viz[b] = 1;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    int sursa = 1;
    for(int i = 1; i <= n; i++){
        if(!viz[i]){
            sursa = i;
            break;
        }
    }


    viz.reset();
    dfs(sursa);

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