【模板】最小生成树

【模板】最小生成树

Kruskal算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//最小生成树_Kruskal 
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,f[5005],ans,cnt,fx,fy;
struct node {
int x,y,z;
} a[200005];
bool cmp(node x,node y) {
return x.z<y.z;
}
int find(int k) {
if(f[k]==k)return k;
return f[k]=find(f[k]);
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)f[i]=i;//初始化并查集
for(int i=1; i<=m; i++) {
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
sort(a+1,a+1+m,cmp);//按边权升序排序
for(int i=1; i<=m; i++) {
fx=find(a[i].x);fy=find(a[i].y);
if(fx==fy)continue;//如果已相连则不再连
f[fy]=fx;
ans+=a[i].z;
cnt++;
if(cnt==n-1)break;
}
printf("%d",ans);
}