这篇文章给大家介绍Kruskal算法求图的最小生成树的完整C代码是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
十多年的召陵网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整召陵建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“召陵网站设计”,“召陵网站推广”以来,每个客户项目都认真落实执行。
求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。
代码采用邻接矩阵表示图,采用边集表示法,代码将大大简化。代码中很多地方可以优化,因为只是用来学习算法,没有去优化。
/* 最小生成树的Kruskal算法 */ #include#include #include #define MaxSize 20 typedef char VertexType; typedef struct Graph { //定义图的邻接矩阵表示法结构 VertexType ver[MaxSize+1]; int edg[MaxSize][MaxSize]; }Graph; typedef struct gEdge { //定义一个边集结构,用来存储图的所有边信息 int begin; int end; int weight; }gEdge; void CreateGraph( Graph *g ) //邻接矩阵法图的生成函数 { int i = 0; int j = 0; int VertexNum; VertexType Ver; printf("请输入图的顶点:\n"); while( '\n' != (Ver=getchar()) ) { g->ver[i++] = Ver; } g->ver[i] = '\0'; VertexNum = strlen(g->ver); printf("请输入相应的的邻接矩阵:\n"); for( i=0; i edg[i][j]); } void PrintGraph( Graph g ) //打印图的结点标识符和邻接矩阵 { int i, j; int VertexNum = strlen(g.ver); printf("图的顶点为:\n"); for( i=0; i p[j].weight ) { temp = p[i]; p[i] = p[j]; p[j] = temp; } return p; } //Kruskal算法生成MST void Kruskal( Graph g ) { int VertexNum = CalVerNum( g ); int EdgNum = CalEdgNum( g ); gEdge *p = CreateEdges( g ); int *index = (int *)malloc(sizeof(int)*VertexNum); //index数组,其元素为连通分量的编号,index[i] = index[j] 表示编号为i 和 j的顶点在同一个连通分量中,反之则不在同一个连通分量 int *MSTEdge = (int *)malloc(sizeof(int)*VertexNum-1); //MSTEdge数组,用来存储已确定的MST的边的编号,共VertexNum-1条边 int k= 0; int WeightSum = 0; int IndexBegin, IndexEnd; for(int i=0; i =0 && index[p[j].end]>=0 && index[p[j].begin]==index[p[j].end]) ) { //找到当前还没加入到同一个连通分量且权值最下的边 MSTEdge[i] = j; //将其加入到MST中去 if( (-1 == index[p[j].begin]) && (-1 == index[p[j].end]) ) //该边的两个顶点都没加入过任何一个连通分量 index[p[j].begin] = index[p[j].end] = i; else if( (-1 == index[p[j].begin]) && (index[p[j].end] >= 0) ) { //该边的尾end已在一个连通分量,头begin未加入过任何连通分量 index[p[j].begin] = i; IndexEnd = index[p[j].end]; for(int n=0; n = 0) ) { //该边的头begin已在一个连通分量,尾end未加入过任何连通分量 index[p[j].end] = i; IndexBegin = index[p[j].begin]; for(int n=0; n 测试数据和结果
测试的图为:
测试通过
关于Kruskal算法求图的最小生成树的完整C代码是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
当前标题:Kruskal算法求图的最小生成树的完整C代码是什么
地址分享:http://cdweb.net/article/gcecoh.html