Cod sursa(job #1922519)

Utilizator greenadexIulia Harasim greenadex Data 10 martie 2017 17:46:44
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>

#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair
 
using namespace std;
 
const string name = "asmax",
             in_file = name + ".in",
             out_file = name + ".out";
 
ifstream fin(in_file);
ofstream fout(out_file);
 
const int MAX = 1.6e4 + 5;

int n;
int total_sum;
int value[MAX];
int sum[MAX];
int father[MAX];
vector<int> tree[MAX];

void dfs(int node, int father_node) {
	sum[node] = value[node];
	father[node] = father_node;

	for (int adj : tree[node]) {
		if (adj != father_node) {
			dfs(adj, node);
			sum[node] += sum[adj];
		}
	}
}

int main() {
	fin >> n;
	for (int i = 1; i <= n; i++) {
		fin >> value[i];
		total_sum += value[i];
	}

	for (int a, b, i = 1; i < n; i++) {
		fin >> a >> b;
		tree[a].push_back(b);
		tree[b].push_back(a);
	}

	dfs(1, 1);

	int max_sum = 1 - (1 << 30);
	for (int i = 1; i <= n; i++) {
		for (int adj : tree[i]) {
			if (adj != father[i]) {
				max_sum = max(max_sum, sum[adj] + value[i]);
				max_sum = max(max_sum, sum[adj]);
			}
		}

		max_sum = max(max_sum, total_sum - sum[i] + value[i]);
		max_sum = max(max_sum, total_sum - sum[i]);
	}

	fout << max_sum;
	return 0;
}