这个算法比较简单,对于这个网友已经写烂了,我现在写的不过是老生常谈的东西了。
还是简单记一下步骤
1:边排序
2:从小到大加入边,不要生成回路
#include<iostream>
#include<algorithm>
#define MAXN 2000
using namespace std;
int n,e;//点的个数,边的个数
struct k{
int x;
int y;
int w;
}k_e[MAXN];
//起点,终点,权值
int dad[MAXN];//父亲集合
bool cmp(k a,k b)
{
return a.w<b.w;
}
int getfather(int x)
{
if(x==dad[x])
return x;
dad[x]=getfather(dad[x]);//跟新查找X的父亲集合
return dad[x];
}
void kruskal(){
int i,p,ans;
for(i=1;i<=n;i++)
dad[i]=i;//初始化自己为自己父亲
p=1;ans=0;//p为加入的边数
for(i=1;i<=e;i++)
{
if(getfather(k_e[i].x)!=getfather(k_e[i].y))//加入的边父亲是否为同一个,如果是,则加入该边会生成回路
{
cout<<k_e[i].x<<k_e[i].y<<k_e[i].w;//选取的边
cout<<"------------"<<endl;
ans+=k_e[i].w;//ans记录权重值和
dad[getfather(k_e[i].x)]=k_e[i].y;//加入后使他们的父亲为同一个
p++;
if(p==n){
cout<<ans<<endl;
return ;
}
}
}
return ;
}
/*
5 7
1 3 1
1 5 3
3 4 1
4 2 5
2 5 5
3 5 2
4 5 2
*/
int main(){//测试
int i,j;
cout<<"点个数和边数依次为:"<<endl;
cin>>n>>e;
cout<<"边的构造是:"<<endl;
cout<<"起点 终点 权值"<<endl;
for(i=1;i<=e;i++)
cin>>k_e[i].x>>k_e[i].y>>k_e[i].w;
sort(k_e+1,k_e+e+1,cmp);
for(i=1;i<=e;i++)
cout<<k_e[i].w;
cout<<endl;
kruskal();
system("pause");
return 0;
}