제출 #858460

#제출 시각아이디문제언어결과실행 시간메모리
858460serifefedartarSjekira (COCI20_sjekira)C++17
110 / 110
38 ms6360 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 998244353;
const ll LOGN = 18; 
const ll INF = 1e15;
const ll MAXN = 1e5 + 5;

vector<pair<ll,pair<int,int>>> edge;
ll t[MAXN];
int par[MAXN], sz[MAXN], mx[MAXN];
int find(int node) {
	if (node == par[node])
		return node;
	return par[node] = find(par[node]);
}

void unite(int a, int b) {
	a = find(a);
	b = find(b);
	if (sz[a] < sz[b])
		swap(a, b);
	mx[a] = max(mx[a], mx[b]);
	par[b] = a;
	sz[a] += sz[b];
}

int main() {
	fast
	int n, a, b;
	cin >> n;

	for (int i = 1; i <= n; i++)
		cin >> t[i];
	for (int i = 1; i <= n; i++)
		par[i] = i, sz[i] = 1, mx[i] = t[i];

	for (int i = 1; i < n; i++) {
		cin >> a >> b;
		edge.push_back({max(t[a], t[b]), {a, b}});
	}
	sort(edge.begin(), edge.end());

	ll ans = 0;
	for (auto u : edge) {
		int x = find(u.s.f);
		int y = find(u.s.s);
		ans += mx[x] + mx[y];
		unite(x, y); 
	}
	cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...