Cod sursa(job #1716066)

Utilizator preda.andreiPreda Andrei preda.andrei Data 11 iunie 2016 22:16:11
Problema Asmax Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define NMAX 16000

vector<int> ad[NMAX + 1];
vector<int> sumeMaxime(NMAX + 1);
vector<bool> vizitat(NMAX + 1);
vector<bool> inCoada(NMAX + 1);

void aflaSume(int n);
void construiesteCoada(queue<int> &q, int n);

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

    int n;
    fin >> n;

    for(int i = 1; i <= n; ++i)
        fin >> sumeMaxime[i];

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

    aflaSume(n);

    int sumaMax = sumeMaxime[1];
    for(int i = 2; i <= n; ++i)
        if(sumeMaxime[i] > sumaMax)
            sumaMax = sumeMaxime[i];

    fout << sumaMax << "\n";
    return 0;
}

void aflaSume(int n){
    queue<int> q;
    construiesteCoada(q, n);

    while(!q.empty()){
        int nod = q.front();
        q.pop();

        vizitat[nod] = true;

        for(int vecin : ad[nod]){
            if(sumeMaxime[nod] > 0 && !vizitat[vecin])
                sumeMaxime[vecin] += sumeMaxime[nod];
            if(!inCoada[vecin]){
                q.push(vecin);
                inCoada[vecin] = true;
            }
        }
    }
}

void construiesteCoada(queue<int> &q, int n){
    for(int i = 1; i <= n; ++i){
        if(ad[i].size() == 1){
            q.push(i);
            inCoada[i] = true;
        }
    }
}