P2121 拆地毯
这题考察的就是并查集(忘了并查集怎么做,刷题水题回忆回忆)
思路就是对地毯以美丽度为关键字,由大到小进行排序
保留的地毯,地毯的两端相连的部分将合并,所以保留的地毯,原先两端不属于一类,这就避免了产生环。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct node {
int u, v, w;
}a[maxn];
int n, m, k;
int f[maxn];
bool cmp(const node &x, const node &y) {
return x.w > y.w;
}
int getf(int v) {
if(f[v] == v)
return v;
else {
f[v] = getf(f[v]);
return f[v];
}
}
void merge(int u, int v) {
int r1 = getf(u);
int r2 = getf(v);
if(r1 != r2) {
f[r2] = r1;
}
}
int main(){
int u, v, w, ans = 0;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; i++){
scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
}
sort(a + 1, a + m + 1, cmp);
for(int i = 1; i <= n; i++){
f[i] = i;
}
for(int i = 1, j = 0; i <= m && j < k; i++) {
int l = getf(a[i].u);
int r = getf(a[i].v);
if(l != r){
merge(l, r);
j++;
ans += a[i].w;
}
}
cout << ans << endl;
return 0;
}