目录
1:kruskal算法介绍
kruskal算法它是用来解决最小生成树类的问题,至于什么是最小生成树类的问题,就是在图论中,各个点都可以到达,并且它们的总权值最小。
算法思想:用到了关于并查集的思想,简单的来说,一开始所有的点都是不同的集合,我们在其中要开始选取权值最小的点,并且将该边的起点和终点加入到相同的S集合中,后面继续操作,如果发现点已经在S集合中,则筛取它,换取另外的边,直到选取的边达到n-1的数量(n就是节点数)
2:kruskal算法代码展现
#include<bits/stdc++.h>
using namespace std;
//kruskal代码展现
int n,m;
int father[1100];
typedef struct{
int u,v,w;
}node;
node edge[3000];
struct rule{
bool operator()(node a,node b){
return a.w<b.w;
}
};
int find(int x)
{
if(father[x]==x)return x;
else {
return father[x]=find(father[x]);
}
}
int kruskal()
{
int ans=0;//记录最小生成树的权值和
int nums=0;//记录边数
for(int i=0;i<m;i++){
int x=edge[i].u;
int y=edge[i].v;
if(find(x)!=find(y)){
father[find(x)]=find(y);
ans+=edge[i].w;
nums++;
if(nums==n-1)break;
}
}
if(nums==n-1)return ans;
else return -1;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)cin>>edge[i].u>>edge[i].v>>edge[i].w;
sort(edge,edge+m,rule());
for(int i=1;i<=n;i++)father[i]=i;
int t=kruskal();
cout<<t;
return 0;
}
以上是个人对于kruskal算法的感悟,如有错误,还请指正!!!