#include <bits/stdc++.h>
using namespace std;
#define all(x) begin(x), end(x)
typedef long long ll;
#define int ll
const char nl = '\n';
const int N = 1e5+5;
const int inf = 1e8+10;
//const int mod = 1e9*5e5+10;
int n, m, k, p[N], pai[N];
int A[25], B[25], used[25];
ll ans;
vector<tuple<int,int,int>> edges;
vector<tuple<int,int,int>> graph[N];
int find(int x) {
if(x == pai[x]) return x;
return pai[x] = find(pai[x]);
}
bool join(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return 0;
pai[x] = y;
return 1;
}
ll dfs(int x, int pa) {
ll sum = p[x];
for(auto [viz, cost, flag] : graph[x]) {
if(viz == pa) continue;
ll s_viz = dfs(viz, x);
ans += s_viz * cost * flag;
sum += s_viz;
}
return sum;
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
for (int i = 0; i < m; ++i) {
int a, b, w;
cin >> a >> b >> w;
edges.push_back({w, a, b});
}
sort(all(edges));
for (int i = 0; i < k; ++i)cin >> A[i] >> B[i];
for (int i = 1; i <= n; ++i){cin >> p[i]; pai[i] = i; }
for (auto [w, a, b]: edges) {
if (!join(a, b))continue;
bool done = false;
for (int i = 0; i < k; ++i) {
if (used[i] == 0 && find(A[i]) == find(B[i])) {
done = true, used[i] = 1;
graph[A[i]].push_back({B[i], w, 1});
graph[B[i]].push_back({A[i], w, 1});
//cout << A[i] << " " << B[i] << " " << w << nl;
break;
}
}
if (!done)graph[a].push_back({b, w, 0}), graph[b].push_back({a, w, 0});
}
dfs(1, 1);
cout << ans;
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... |