P2820 局域网

题目链接 https://www.luogu.com.cn/problem/P2820

Kruskal最小生成树,求所有不选的边的权值之和


 

放AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,k;
 4 int cnt;
 5 int sum;
 6 int ans;//总长
 7 int p[210];
 8 
 9 struct Edge
10 {
11     int u;
12     int v;
13     int w;
14 }edge[20010];
15 
16 bool cmp(Edge a,Edge b)
17 {
18     return a.w<b.w;
19 }
20 
21 int Find(int x)
22 {
23     return p[x]==x?x:Find(p[x]);
24 }
25 
26 void kruskal()
27 {
28     sort(edge+1,edge+k+1,cmp);
29     for(int i=1;i<=k;i++)
30     {
31         int x=Find(edge[i].u);
32         int y=Find(edge[i].v);
33         if(x==y) continue;
34         sum+=edge[i].w;
35         p[y]=x;
36         cnt++;
37         if(cnt==n) return;
38     }
39 }
40 
41 int main()
42 {
43     cin>>n>>k;
44     for(int i=1;i<=n;i++)
45         p[i]=i;
46     for(int i=1;i<=k;i++)
47     {
48         cin>>edge[i].u>>edge[i].v>>edge[i].w;
49         ans+=edge[i].w;
50     }
51     kruskal();
52     cout<<ans-sum;
53     return 0;
54 }

 

posted @ 2022-04-24 21:49  爱吃虾滑  阅读(21)  评论(0编辑  收藏  举报