按照Kruskal思想,n个结点的生成树有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。

实现Kruskal算法的关键问题是:
当一条边加入T的边集中后,如何判断是否构成回路。
一种解决方法是定义一个一维数组f[n],存放T中每一个顶点所处连通分量的编号。
开始令f[i]=i,即图中每个顶点自成一个连通分量。
如果要往T的边集中增加一条边(vi, vj),首先检查f[i]和f[j]是否相同,若相同,则表明vi和vj处在同一连通分量中,加入此边必然形成回路;

若不相同,则不会形成回路,此时可以把此边加入生成树的边集中。

当加入一条新边后,必然将两个不同的连通分量连通,此时就需将两个连通分量合并,合并方法是将一个连通分量的编号换成另一个连通分量的编号。

下面以图的边表结构(用一个结构体存储图的顶点数、边数、顶点信息、边的信息)来存储一个带权的连通图,实现Kruskal算法如下:

#include <iostream>
#include <algorithm>
using namespace std;
const int MaxcertexNum = 30;
const int MaxEdge = 100;
typedef int VertexType;class ENode
{friend bool cmp(ENode a, ENode b);friend class ELGraph;
private:int vertex1;int vertex2;int weight;
};class ELGraph
{public:ELGraph() {};void CreateGraph();void Kruskal(ENode TE[]);
private:void Sort(ENode *a);int vertexnum;int edgenum;VertexType vertexs[MaxcertexNum];ENode edges[MaxcertexNum];int f[MaxcertexNum];int  Find(int x){if (f[x] != x) return Find(f[x]);else return x;};void Union(int x, int y){f[Find(y)] = Find(x);}
};bool cmp(ENode a, ENode b)
{return a.weight < b.weight;
}void ELGraph::Sort(ENode *a)
{sort(a, a + edgenum, cmp);
}void ELGraph::CreateGraph()
{cout << "请输入顶点数和边数" << endl;cin >> vertexnum >> edgenum;cout << "请依次输入按序号0到n顶点的信息" << endl;for (int i = 0; i < vertexnum; i++){cin >> vertexs[i];}cout << "下面输入边表信息" << endl;for (int i = 0; i < edgenum; i++){int v1, v2, w;cout << "输入边<i,j>对应的顶点序号i,j,再输入该边的权值" << endl;cin >> v1 >> v2 >> w;edges[i].vertex1 = v1;edges[i].vertex2 = v2;edges[i].weight = w;}
}void ELGraph::Kruskal(ENode TE[])
{for (int i = 0; i < vertexnum; i++) f[i] = i;Sort(edges);int k = 0;int j = 0;while (k < vertexnum - 1){int s1 = edges[j].vertex1;int s2 = edges[j].vertex2;if (Find(s1)!=Find(s2)){TE[k].vertex1 = s1;TE[k].vertex2 = s2;TE[k].weight = edges[k].weight;k++;Union(s1, s2);}j++;}for (int i = 0; i < vertexnum - 1; i++){cout << TE[i].vertex1 << "->" << TE[i].vertex2 << " " << TE[i].weight << endl;}
}int main()
{ELGraph g;g.CreateGraph();ENode TE[50];g.Kruskal(TE);return 0;
}

测试结果:

C++ 实现无向图的最小生成树Kruskal算法(完整代码)相关推荐

  1. 实现最小生成树Kruskal算法(附完整代码)

    实现最小生成树Kruskal算法(附完整代码) Kruskal算法是一种常见的计算最小生成树的算法.它的主要思想是将所有的边按照权值从小到大进行排序,并逐个加入到生成树中,如果加入后不会形成环,则保留 ...

  2. 图的最小生成树-Kruskal算法

    问题引入 [问题描述] 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法. [输入形式] 输入图的顶点序列及图的边的情况.如样例所示.边的输入以输入-1,-1,-1作为结束 ...

  3. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  4. 最小生成树kruskal算法

    最小生成树kruskal算法 概述 算法分析 代码 概述 克鲁斯卡尔(Kruskal)(Kruskal)(Kruskal)算法是求连通网的最小生成树的另一种方法.与普里姆(Prim)(Prim)(Pr ...

  5. java做a_Java编程实现A*算法完整代码

    前言 A*搜寻算法俗称A星算法.这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法.常用于游戏中 通过二维数组构建的一个迷宫,"%"表示墙壁,A为起点,B为终点,&qu ...

  6. C++ 实现无向图的最小生成树Prim算法(附完整代码)

    实现Prim算法,需设置两个辅助一维数组lowcost和closevertex. 其中lowcost用来保存集合V-U中各顶点与集合U中各顶点构成的边中具有最小权值的边的权值: 数组closevert ...

  7. 最小生成树kruskal算法并查集版 C语言实现

    今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...

  8. 最小生成树 Kruskal算法

    并查集的应用 ,Kruskal,最小生成树算法. 求加权连通图的最小生成树的算法.kruskal算法总共选择n- 1条边,(共n个点): 每次从剩下的边中选择一条不会产生环路的具有最小耗费(最小权值) ...

  9. 图论(九)最小生成树-Kruskal算法

    前面说过,Kruskal是从最短边着手构建最小生成树的.其基本过程是:先对图中的所有边按照权重值从小到大进行排序,然后着手选取边构建最小生成树.如果直接从小到大按顺序选取,有可能形成了环,所以对环的处 ...

最新文章

  1. 【极客blog图文讲解】ruby以及Jekyll的环境配置(针对mac linux)
  2. vue实现侧边折叠菜单栏手风琴效果
  3. 如何将多个PDF合成为一个PDF,并且大小统一?
  4. 【CVPR2019】完整论文列表二
  5. HTML-Label-框架-字符实体-全局属性-CSS基本语法结构
  6. oracle在linux上使用裸设备,在linux下构建基于LVM的裸设备数据库
  7. 赵本山 政治敏锐_每天5分钟保持敏锐的7种方法
  8. 信号硬件入门--振幅调制信号发生器(正弦波发生器方案、AM调制方案)--First理论部分
  9. 计算机一级考试评分规则标准,CAD考试规则评分标准
  10. QQ音乐API爬取全过程
  11. CTFshow—Misc入门1—23以及41(基础操作+信息附加)
  12. xp系统计算机蓝屏,xp蓝屏,教您教你怎么修复xp蓝屏问题
  13. “正信小宝”养老篇:坐享绿色稳定收益
  14. PAP认证、CHAP认证
  15. Ebc编码与asc编码转换
  16. JavaWeb学习第二十七天——项目实例
  17. android+饭否+开源,饭否Android客户端推荐:有饭
  18. 宽带中KB与Kb的区别
  19. 《人工智能》—— 思维导图
  20. 七个常出口国的最新关税要求

热门文章

  1. 【三维激光扫描】实验01:环境搭建CAD2014+StonexSiScan软件安装
  2. linux之ubunt把启动栏底部和左边切换
  3. linux之openssl简单介绍
  4. Android之 AudioTrack学习
  5. Shell常用命令总结
  6. 保姆级的HTML零基础教程少见吧?这是第一节(1)
  7. html td显示隐藏,显示/隐藏Html TR/TD
  8. linux nginx线程池,nginx使用线程池提升9倍性能
  9. 王道408数据结构——第七章 查找
  10. CCF-CSP认证201312-1(出现次数最多的数)