好久没写了,简单一下回顾回顾。
kruskal算法适合简单的最小生成树,利用并查集的思想将点不断加入到父节点中。
算法实现:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int fat[107];
struct node//结构体记录一对节点及权值
{
int from,to,val;
}edge[107];
bool cmp(node a,node b)//把边按照从小到大顺序排列好
{
return a.val<b.val;
}
int findfa(int x)//寻找父节点
{
if(fat[x]!=x)
return findfa(fat[x]);
return x;
}
void uni(int x,int y)//将两个有边相连的点加入同一个父节点
{
fat[findfa(y)]=findfa(x);
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>edge[i].from>>edge[i].to>>edge[i].val;
for(int i=1;i<=n;i++)
fat[i]=i;
sort(edge+1,edge+n+1,cmp);
int k=0,tot=0;
for(int i=1;i<=m;i++)//直到找到n-1y条边为止
{
if(k==n-1)
break;
if(edge[i].from!=edge[i].to)
{
uni(edge[i].from,edge[i].to);
tot+=edge[i].val;
k++;
}
}
cout<<tot<<endl;
return 0;
}