#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#define N 50000
typedef long long ll;
using namespace std;
//边
struct edge{
int u,v,w; //u起始点,v结束点,w权值
}edge[N+1];
int p[N+1],r[N+1];
int m,n; //m边数,n点数
//从小到大排序
int cmp(int i,int j){
return edge[i].w<edge[j].w;
}
//并查集 ,递归
int found(int x){
return p[x]==x?x:p[x]=found(p[x]);
}
ll Kruskal(){
ll ans=0; //权值和
int i,j,e,x,y;
for(i=0;i<n;i++)
p[i]=i; //保存点
for(i=0;i<m;i++)
r[i]=i; //保存边
sort(r,r+m,cmp); //边从大到小排序
for(i=0;i<m;i++){
e=r[i];
x=found(edge[e].u);
y=found(edge[e].v);
if(x!=y){
ans=ans+edge[e].w;
p[x]=y;
}
}
return ans;
}
int main(){
int i;
scanf("%d %d",&n,&m);
for(i=0;i<m;i++)
scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w);
ll s=Kruskal();
printf("%lld\n",s);
return 0;
}
Kruskal——求无向图的最小生成树+并查集
最新推荐文章于 2022-11-18 13:29:01 发布