New Exercise

This commit is contained in:
e2hang
2025-12-08 22:54:52 +08:00
parent 4965074539
commit ce2b06bf1e
8 changed files with 726 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
using namespace std;
int find(int x, vector<int>& p) {
if(p[x] != x) p[x] = find(p[x], p);
return p[x];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
int vir = n;//虚拟节点
n++;
vector<tuple<int, int, int>> edges;
vector<int> p(n);
for (int i = 0; i < n - 1; i++) {
cin >> p[i];
edges.push_back(make_tuple(vir, i, p[i]));
}
for(int i = 0; i < m; i++){
int a, b, w;
cin >> a >> b >> w;
edges.push_back(make_tuple(a, b, w));
}
auto cmp = [](const tuple<int, int, int>& a, const tuple<int, int, int>& b) {
return get<2>(a) < get<2>(b);
};
sort(edges.begin(), edges.end(), cmp);
for(int i = 0; i < n; i++) {
p[i] = i;
}
int mins = 0;
int used = 0;
for(int i = 0; i < edges.size(); i++) {
int u = get<0>(edges[i]);
int v = get<1>(edges[i]);
int w = get<2>(edges[i]);
int pu = find(u, p);
int pv = find(v, p);
if(pu != pv) {
p[pu] = pv;
mins += w;
used++;
if(used == n - 1) break;
}
}
cout << mins << endl;
return 0;
}