Cod sursa(job #2671186)

Utilizator Ionut2791Voicila Ionut Marius Ionut2791 Data 11 noiembrie 2020 17:21:15
Problema Asmax Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
#include <algorithm>
using namespace std;

const int N = 16005;

int n;
vector<int> graf[N];
int cost[N];
int sp[N];
bool amfost[N];

struct cmp{
    bool operator()(pair<int,int> a, pair<int,int> b) {
            return a.second > b.second;
    }
};

priority_queue< pair<int,int>, vector<pair<int,int>>, cmp> coada;

void dfs(int nod) {


    amfost[nod] = true;
    for (int i = 0; i < (int)graf[nod].size(); ++i) {
        int to = graf[nod][i];

        if(amfost[to] == false) {
            dfs(to);
            coada.push(make_pair(nod, to));
            sp[nod] += sp[to] + cost[to];
        }

    }
    amfost[nod] = false;
}

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

    int n;
    fin >> n;

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

    for (int i = 1; i < n; ++i) {
        int a, b;
        fin >> a >> b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    dfs(1);
    /*for (int i = 1; i <= n; ++i)
        cout << sp[i] << " ";
    cout << '\n';*/

    while(coada.empty() == false) {
        int sum = coada.top().first;
        int actualizeaza = coada.top().second;
        //cout << sum << " " << actualizeaza << '\n';
        coada.pop();

        sp[actualizeaza] += sp[sum] + cost[sum] - (sp[actualizeaza] + cost[actualizeaza]);
    }
    int maxx = INT_MIN;
    for (int i = 1; i <= n; ++i) {
        maxx = max(maxx, max(sp[i], sp[i] + cost[i]));
        //cout << sp[i] << " ";
    }
    fout << maxx << '\n';

    return 0;
}