Pagini recente » Cod sursa (job #1905835) | Cod sursa (job #309851) | Cod sursa (job #2067513) | Cod sursa (job #2067500) | Cod sursa (job #3328242)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
void dfs(int nod,int niv,const vector<vector<int>>&graf,vector<int>&dp,vector<int>&sol,vector<int>&V){
dp[niv]=nod;
if(!V[nod]){
sol[nod]=0;
}else if(niv-V[nod]>=1){
sol[nod]=sol[dp[niv-V[nod]]]+1;
}else{
sol[nod]=0;
}
for(int vecin:graf[nod])
dfs(vecin,niv+1,graf,dp,sol,V);
}
int main(){
int n;
in>>n;
int x,y;
int root;
vector<int>V(n+1);
vector<vector<int>>graf(n+1);
vector<int>tata(n+1);
vector<int>dp(n+1,0);
vector<int>sol(n+1);
for(int i=1;i<=n;i++){
in>>V[i];
}
for(int i=1;i<n;i++){
in>>x>>y;
graf[x].push_back(y);
tata[y]=x;
}
for(int i=1;i<=n;i++){
if(!tata[i]){
root=i;
break;
}
}
dfs(root,1,graf,dp,sol,V);
for(int i=1;i<sol.size();i++){
out<<sol[i]<<" ";
}
}