#include<stdio.h>
#include<iostream>
using namespace std;
#include<algorithm>
#include<string.h>
#define maxn 110
int n,m;//点个数,边数
int parent[maxn];
int ans;
struct eage//边的结构体
{
int u,v,w;//u,v为两端点w为边全值
}EG[5010];
int Find(int x)
{
if(parent[x]==-1)
return x;
return Find(parent[x]);
}
bool cmp(eage a,eage b)
{
return a.w<b.w;
}
void Kruskal()
{
memset(parent,-1,sizeof(parent));
sort(EG+1,EG+m+1,cmp);
ans=0;
for(int i=1;i<=m;i++)
{
int t1=Find(EG[i].u),t2=Find(EG[i].v);
if(t1!=t2)
{
ans+=EG[i].w;
parent[t1]=t2;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)
scanf("%d%d%d",&EG[i].u,&EG[i].v,&EG[i].w);
Kruskal();
printf("%d\n",ans);
}
}
Kruskal算法(并查集)
最新推荐文章于 2022-11-13 11:15:32 发布