New Exercise
This commit is contained in:
67
Exercise/Homework8/Q3MiniTree.cpp
Normal file
67
Exercise/Homework8/Q3MiniTree.cpp
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user