#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
struct Edge {
int i, j, w;
};
int N, M, K;
vector<vector<pii>> tree;
vector<int> P;
ll res = 0;
bool setup(int curr, int prev, int tar, int w) {
if (curr == tar) return true;
for (auto &[c, cw]: tree[curr]) {
if (c == prev) continue;
if (setup(c, curr, tar, w)) {
if (cw == -1) cw = w;
return true;
}
}
return false;
}
ll eval(int curr, int prev) {
ll up = P[curr];
for (auto [c, w]: tree[curr]) {
if (c == prev) continue;
const ll upc = eval(c, curr);
res += w * upc;
up += upc;
}
return up;
}
int main() {
cin >> N >> M >> K;
vector<Edge> edges(M);
for (Edge &e: edges) {
cin >> e.i >> e.j >> e.w;
e.i--; e.j--;
}
vector<pii> add(K);
for (pii &e: add) {
cin >> e.first >> e.second;
e.first--; e.second--;
}
P.resize(N);
for (int &x: P) cin >> x;
sort(edges.begin(), edges.end(), [](Edge a, Edge b) {return a.w < b.w;});
tree.clear();
tree.resize(N);
for (int h = 0; h < K; h++) {
tree[add[h].first].push_back({add[h].second, -1});
tree[add[h].second].push_back({add[h].first, -1});
}
for (Edge e: edges) {
if (!setup(e.i, -1, e.j, e.w)) {
tree[e.i].push_back({e.j, 0});
tree[e.j].push_back({e.i, 0});
}
}
res = 0;
eval(0, -1);
cout << res << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |