这个算法比较简单,对于这个网友已经写烂了,我现在写的不过是老生常谈的东西了。
还是简单记一下步骤
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; }