最小生成树-Kruskal

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int MAXN=100010;
 6 
 7 struct Blanket
 8 {
 9     int area1,area2;
10     int beauty;
11 }b[MAXN];
12 inline bool cmp(Blanket a,Blanket b) {return a.beauty>b.beauty;}
13 
14 int head[MAXN];
15 int root(int x)
16 {
17     if (head[x]==x) return x;
18     return head[x]=root(head[x]);
19 }
20 
21 int main()
22 {
23     int n,m,k;
24     cin>>n>>m>>k;
25 
26     int cnt=0;
27     for (int i=1;i<=m;i++)
28     {
29         cnt++;
30         cin>>b[cnt].area1>>b[cnt].area2>>b[cnt].beauty;
31     }
32     sort(b+1,b+cnt+1,cmp);
33 
34     for (int i=1;i<=n;i++) head[i]=i;
35     int t=0,ans=0;
36     for (int i=1;i<=m;i++)
37     {
38         if (head[root(b[i].area1)]!=root(b[i].area2))
39         {
40             head[root(b[i].area1)]=root(b[i].area2);
41             ans+=b[i].beauty;
42             t++;
43             if (t==k) break;
44         }
45     }
46     cout<<ans<<endl;
47 
48     return 0;
49 }

 

posted @ 2021-12-04 21:43  Hell0er  阅读(4)  评论(0编辑  收藏  举报