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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}