Pagini recente » Cod sursa (job #1611393) | Cod sursa (job #297207) | Cod sursa (job #2951707) | Cod sursa (job #603256) | Cod sursa (job #2812575)
#include <iostream>
#include <vector>
#include <algorithm>
using adj_t = std::vector<std::vector<int>>;
using vis_t = std::vector<char>;
int DFS(const int src, std::vector<int>& best, vis_t& visited, const adj_t& adj,
const std::vector<int>& costs)
{
visited[src] = true;
best[src] = costs[src];
for(const int neigh : adj[src])
{
if(visited[neigh])
{
continue;
}
const int best_sub = DFS(neigh, best, visited, adj, costs);
if(best_sub > 0)
{
best[src] += best_sub;
}
}
return best[src];
}
int main()
{
std::freopen("asmax.in", "r", stdin);
std::freopen("asmax.out", "w", stdout);
int N;
std::cin >> N;
std::vector<int> costs(N + 1);
for(int i = 1; i <= N; ++i)
{
std::cin >> costs[i];
}
adj_t adj(N + 1);
for(int i = 0; i < N - 1; ++i)
{
int a, b;
std::cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
std::vector<char> visited(N + 1, false);
std::vector<int> best(N + 1);
DFS(1, best, visited, adj, costs);
std::cout << *std::max_element(best.begin() + 1, best.end()) << '\n';
}