Pagini recente » Cod sursa (job #2311400) | Cod sursa (job #511561) | Borderou de evaluare (job #2007025) | Cod sursa (job #399973) | Cod sursa (job #2538850)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 16005
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
vector <int> arb[NMAX];
int val[NMAX], N, dp[NMAX];
void DFS(int node, int dad)
{
if(arb[node].size() == 0){
dp[node] = val[node];
return;
}
for(int i = 0; i < arb[node].size(); i++){
if(arb[node][i] != dad)
DFS(arb[node][i],node);
if(dp[arb[node][i]] > 0 && arb[node][i] != dad){
dp[node] += dp[arb[node][i]];
}
//dp[node] = max(dp[node],dp[arb[node][i]] + val[node]);
}
dp[node] += val[node];
}
int main()
{
int x, y, ans = 0;
fin >> N;
for(int i = 1; i <= N; i++){
fin >> val[i];
}
if(N == 1){
fout << val[1] << "\n";
return 0;
}
for(int i = 1; i < N; i++){
fin >> x >> y;
arb[x].push_back(y);
arb[y].push_back(x);
}
DFS(1,0);
for(int i = 1; i <= N; i++){
ans = max(ans,dp[i]);
}
fout << ans << "\n";
return 0;
}