67 lines
1.3 KiB
C++
67 lines
1.3 KiB
C++
#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;
|
|
} |