Cod sursa(job #2562432)

Utilizator ZahaZaharie Stefan Zaha Data 29 februarie 2020 14:19:56
Problema Asmax Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;

int valori[16005];
vector <int> muchii[16005];
bitset <16005> vizitat;

bool doarNeg = true;
int maxim = -1005;

int find(int nod) {
    int suma = valori[nod];
    for (unsigned int i = 0; i < muchii[nod].size(); ++i) {
        int vecin = muchii[nod][i];
        if (vizitat[vecin])
            continue;
        vizitat[vecin] = true;

        int temp = find(vecin);
        if (temp > 0)
            suma += temp;
    }

    return suma;
}

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

    int n;
    fin >> n;

    for (int i = 1; i <= n; ++i) {
        fin >> valori[i];
        if (valori[i] > 0)
            doarNeg = false;
    }

    if (doarNeg) {
        for (int i = 1; i <= n; ++i)
            if (valori[i] > maxim)
                maxim = valori[i];

        fout << maxim;
        return 0;
    }

    for (int i = 1; i < n; ++i) {
        int x, y;
        fin >> x >> y;
        
        muchii[x].emplace_back(y);
        muchii[y].emplace_back(x);
    }

    //Cauta o radacina valida (pozitiva sau nula)
    int radacina = 1;
    while (radacina < 0)
        ++radacina;
    
    vizitat[radacina] = true;
    fout << find(radacina);
    return 0;
}