最小生成树----Kruskal算法

    最小生成树的另一种算法,比较适合处理稀疏图。算法思想:按权值的递增次序选择合适的边来构造最小生成树。

以下代码包含无向带权图的建立,Kruskal算法的完整过程。请观看【动画演示Kruskal算法 】,验证程序是否正确。

代码说明:

1.vest[]数组存放两个顶点间的连通分量

2.结构体E[]数组是按权值从小到大排列的边集

3.对E的排序采用了qsort排序,自定义的排序函数是对结构体的二级排序

 

给定的带权无向图如下:

最小生成树----Kruskal算法_第1张图片

 

实现的完整代码如下:

#include <iostream> #include <stdlib.h> //使用快排函数 using namespace std; #define MaxVertexNum 100 //最大的顶点数 #define MaxEdgeNum 100 //最大的边数 #define INF 32767 //将无法到达的权值无限大设为32767 typedef char VertexType; typedef int EdgeType; typedef struct { VertexType vertex[MaxVertexNum]; //顶点表 EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看做边表 int n,e; //图中当前的顶点数和边数 }MGraph; void CreateMGraph(MGraph &G) { int i,j,k,m; cout<<"请输入顶点数和边数:"; cin>>G.n>>G.e; cout<<"请输入顶点元素:"; for (i=0;i<G.n;i++) { cin>>G.vertex[i]; } for (i=0;i<G.n;i++) { for (j=0;j<G.n;j++) { G.edges[i][j]=INF; //初始化无限大权值 if (i==j) { G.edges[i][j]=0; //对角线为0 } } } // 无向网图的建立 cout<<"请输入边两端顶点序号和相应的权值:/n"; for (k=0;k<G.e;k++) { cin>>i>>j>>m; G.edges[i][j]=m; //G.edges[j][i]=m; //对称矩阵,这里只存入上三角。 } } typedef struct node { int u; //边的起始顶点 int v; //边的终止顶点 int w; //边的权值 }Edge; int cmp( const void *a , const void *b ) { struct node *c = (node *)a; struct node *d = (node *)b; if(c->w != d->w) return c->w - d->w; else return d->u - c->u; } void kruskal(MGraph G) { int i,j,u1,v1,sn1,sn2,k; int vset[MaxVertexNum]; //辅助数组,判定两个顶点是否连通 Edge E[MaxEdgeNum]; //存放所有的边 k=0; //E数组的下标从0开始 for (i=0;i<G.n;i++) { for (j=0;j<G.n;j++) { if (G.edges[i][j]!=0 && G.edges[i][j]!=INF) { E[k].u=i; E[k].v=j; E[k].w=G.edges[i][j]; k++; } } } qsort(E,k,sizeof(E[0]),cmp); //快速排序,按权值从小到大排列 for (i=0;i<G.n;i++) //初始化辅助数组 { vset[i]=i; } k=1; //生成的边数,最后要刚好为总边数 j=0; //E中的下标 while (k<G.n) { u1=E[j].u; v1=E[j].v; sn1=vset[u1]; sn2=vset[v1]; //得到两顶点属于的集合编号 if (sn1!=sn2) //不在同一集合编号内的话,把边加入最小生成树 { cout<<"( "<<G.vertex[u1]<<"--->"<<G.vertex[v1]<<" ) "<<E[j].w<<endl; k++; for (i=0;i<G.n;i++) { if (vset[i]==sn2) { vset[i]=sn1; } } } j++; } } int main() { MGraph G; CreateMGraph(G); kruskal(G); return 0; }

 

程序测试结果如下:

最小生成树----Kruskal算法_第2张图片

 

你可能感兴趣的:(c,算法,struct,测试,IE,iostream)