P2121拆地毯

一、题目描述

  

 

 二、解题思路

  一个kruscal模板题,只需要把最大的排在前面数k条就行了。

三、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int n,m,k;
 4 int a[100010];
 5 struct node{
 6     int from,to;
 7     int w;
 8 }edges[100010];
 9 int cnt;
10 int find(int u)
11 {
12     return u == a[u] ? u : a[u] = find(a[u]);
13 }
14 void init()
15 {
16     for(int i = 1;i <= n;i++)
17         a[i] = i;
18 }
19 bool cmp(node u,node v)
20 {
21     return u.w > v.w;
22 }
23 int main()
24 {
25     cin >> n >> m >> k;
26     for(int i = 1;i <= m;i++){
27         int u,v,w;
28         cin >> u >> v >> w;
29         edges[++cnt].from = u;
30         edges[cnt].to = v;
31         edges[cnt].w = w;
32     }
33     init();
34     sort(edges + 1,edges + 1 + cnt,cmp);
35     int tt = 0;
36     long long ans = 0;
37     for(int i = 1;i <= cnt;i++){
38         int sx = find(edges[i].from);
39         int sy = find(edges[i].to);
40         if(sx != sy){
41             a[sx] = sy;
42             ans += edges[i].w;
43             tt++;
44         }
45         if(tt == k){
46             cout << ans;
47             return 0;
48         }
49     }
50     cout << ans;
51     return 0;
52 }
posted @ 2022-02-15 21:33  scannerkk  阅读(65)  评论(0)    收藏  举报