我一直觉得这个算法特别像dijisktra。。。
一般用于稀疏图(边数远远小于完全图)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int f[1003];
int ans,t = 0,n,m;
struct node{
int u,v,w;
}e[200003];
bool cmp(node x,node y)
{
return x.w < y.w;
}
int find(int x)//找到根
{
while(x != f[x])x = f[x] = f[f[x]];
return x;
}
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",&e[i].u,&e[i].v,&e[i].w);
}
sort(e + 1,e + m + 1,cmp);//按边长排序
for(int i = 1;i <= m;i++)
{
int x = find(e[i].v);
int y = find(e[i].u);
if(x != y)
{
f[x] = y;
ans += e[i].w;
t++;
}
if(t == n - 1)break;
}
printf("%d",ans);
return 0;
}