Cod sursa(job #1579758)

Utilizator BrandonChris Luntraru Brandon Data 25 ianuarie 2016 07:59:02
Problema Asmax Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream cin ("asmax.in");
ofstream cout ("asmax.out");

vector <int> G[16005];
queue <int> q;

int cost[16005], n, sum, frn;
bool viz[16005], added;

void read()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)
    {
        cin >> cost[i];
    }
    for(int i = 1; i <= n; ++i)
    {
        int a, b;
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
}

void bfs(int node)
{
    ///sum of whole tree, not just 1 branch
    viz[node] = true;
    q.push(node);
    while(q.empty() == false)
    {
        frn = q.front();
        if(added == true)
        {
            sum += cost[frn];
        }
        if(sum < 0)
        {
            sum = 0;
        }
        if(cost[frn] > 0)
        {
            added = true;
            sum += cost[frn];
        }
        q.pop();
        for(auto it: G[frn])
        {
            if(viz[it] == false and cost[it] > 0)
            {
                q.push(it);
            }
        }
    }
}

void solve()
{
    for(int i = 1; i <= n; ++i)
    {
        if(G[i].size() == 1)
        {
            bfs(i);
        }
    }
}

void print()
{
    if(added == false)
    {
        sum = cost[frn];
    }
    cout << sum << " ";
}

int main()
{
    read();
    solve();
    print();
    return 0;
}