Cod sursa(job #2812575)

Utilizator icnsrNicula Ionut icnsr Data 4 decembrie 2021 18:48:08
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#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';
}