#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct{
int kt;//连接1
int jw;//连接2
int qz;//权值
}fhs;//建好结构体,用来储存连接数
fhs a[500000];//定义数组
int w[10000];//并查集数组
int y,u,i,o,p,sum,m,n;// sum权值和,m,n为节点数和权值数
bool cmp(fhs a1,fhs b1)//cmp,贪心判断权值
{
return a1.qz<b1.qz;
}
int find(int x)//并查集查找
{
int u=x;
while(w[x]!=x)
{
x=w[x];
}
while(w[u]!=u)//压缩路径
{
int mm=w[u];
w[u]=x;
u=mm;
}
return u;
}
void rz(int x1,int x2)//合并(认祖归宗
{
int xx1=find(x1);
int xx2=find(x2);
if(xx1!=xx2)
{
w[xx1]=w[xx2];
}
}
int kruscal()
{
int yyy=0;
for(int x=0;x<n;x++)//逐个遍历,n+1次
{
int xx1=find(a[x].jw);
int xx2=find(a[x].kt);
if(xx1!=xx2)//如果他们两并不是一个祖宗,则连接他们两
{
rz(a[x].jw,a[x].kt);
yyy+=a[x].qz;
}
}
return yyy;
}
void chushi()
{
for(int x=0;x<=m;x++)//并查集初始化
{
w[x]=x;
}
sort(a,a+n,cmp);//排序,贪心
}
int main()
{
scanf("%d%d",&m,&n);
for(int x=0;x<n;x++)//输入
{
scanf("%d%d%d",&a[x].kt,&a[x].jw,&a[x].qz);
}
chushi();
sum=kruscal();
printf("%d",sum);
}
感觉这个最小生成树算法的本质就是贪心加上并查集。。。是我的错觉吗