最小生成树---Kruskal算法

#include<iostream>
#include<algorithm>
using namespace std;
struct Edge
{
int v1,v2;
int weight;
};
int pos[13]; //用于存储所得最小生成树的边在结构体数组中的序号 
int p[13];
int r[13];
int k=0; 
//建立结构体数组,数组的每个元素存储一条边的两个顶点和该边的权值 
struct Edge e[13]={{1,4,1},{2,4,1},{5,7,1},{1,6,2},{2,3,2},{2,5,2},{4,7,2},{6,7,2},{7,8,2},{1,2,3},{2,7,3},{3,8,3},{3,5,4}};
int cmp(const int i,const int j)   //间接排序 
{
return e[i].weight<e[j].weight;
}
int find(int x)   //并查集的find 
{
return p[x]==x?x:p[x]=find(p[x]);
}
int Kruskal()
{
int ans=0;
for(int i=0;i<13;i++)  //初始化并查集 
p[i]=i;
for(int i=0;i<13;i++)  //初始化边序号 
r[i]=i;
sort(r,r+13,cmp);      //给边依权值从小到大排序 
for(int i=0;i<13;i++)
{
//找出当前边两个端点所在集合编号 
int b=r[i];
int x=find(e[b].v1);  
int y=find(e[b].v2);
//若在不同集合,合并 
if(x!=y)       
{
ans+=e[b].weight;
p[x]=y;  
pos[k]=b;       //记录下这条新加入最小生成树的边的序号 
k++;
}
}
return ans;        //返回最小生成树的权值 
}
int main()
{
int ans=Kruskal();
cout<<"该最小生成树的权值是:"<<ans<<endl;
cout<<"构成该最小生成树的边共有"<<k<<"条,"<<"分别是:" <<endl;
for(int i=0;i<k;i++)
{
cout<<"("<<e[pos[i]].v1<<","<<e[pos[i]].v2<<","<<e[pos[i]].weight<<")"<<endl;
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/cup160828/article/details/78347726