#include<stdio.h>//m条边,n个点
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int vis[100010];
struct zp
{
int u;
int v;
int w;
} x[1000010];
bool cmp(zp a,zp b)
{
return a.w<b.w;
}
int FIND(int n)//找老大
{
if(vis[n]!=n)
vis[n]=FIND(vis[n]);
return vis[n];
}
void merger(int a,int b)//连通两个点
{
vis[FIND(a)]=FIND(b);
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<m; i++)//读入边及其权值
scanf("%d%d%d",&x[i].u,&x[i].v,&x[i].w);
sort(x,x+m,cmp);//按权值从小到大排序
for(int i=0; i<=n; i++)//初始化并查集
vis[i]=i;
int sum=0,cont=0;
for(int i=0; i<m; i++)
{
if(FIND(x[i].u)!=FIND(x[i].v))//不连通加上该边权值并连起来(老大是不相同)
merger(x[i].u,x[i].v),sum+=x[i].w,cont++;
if(cont==(n-1))//找到n-1条边跳出
break;
}
printf("%d\n",sum);
}
}
kruscal
最新推荐文章于 2025-07-28 10:16:16 发布