Cod sursa(job #2825152)

Utilizator andre.anghelacheAndreea Anghelache andre.anghelache Data 4 ianuarie 2022 10:11:33
Problema Asmax Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int sumaMaxima = -1001;

int sumaMaximaSubarbore(int nodCurent, vector<bool> &vizitate, const vector<int>& costuri, const vector<vector<int>>& listaAdiacenta){
    vizitate[nodCurent] = true;
    int sumaCurenta = costuri[nodCurent];

    for(auto vecin : listaAdiacenta[nodCurent]){
        if(!vizitate[vecin]){
            int sumaSubarbore = sumaMaximaSubarbore(vecin, vizitate, costuri, listaAdiacenta);

            // daca suma subarborelui este pozitiva, o adaugam la suma curenta
            if(sumaSubarbore > 0){
                sumaCurenta += sumaSubarbore;
            }
        }
    }

    sumaMaxima = max(sumaCurenta, sumaMaxima);

    return sumaMaxima;
}

int main() {
    ifstream in("asmax.in");
    ofstream out("asmax.out");

    int noduri, extremitateInitiala, extremitateFinala;
    in >> noduri;

    vector<vector<int>> listaAdiacenta (noduri, vector<int>());
    vector<int> costuriVarfuri(noduri);

    for(int i = 1; i <= noduri; i++){
        in >> costuriVarfuri[i];
    }

    for(int i = 0; i < noduri - 1; i++){
        in >> extremitateInitiala >> extremitateFinala;

        listaAdiacenta[extremitateInitiala].push_back(extremitateFinala);
        listaAdiacenta[extremitateFinala].push_back(extremitateInitiala);
    }

    vector<bool> vizitate(noduri, false);

    out << sumaMaximaSubarbore(1, vizitate, costuriVarfuri, listaAdiacenta);

    in.close();
    out.close();
    return 0;
}