克鲁斯卡尔算法思想过程
克鲁斯卡尔算法是计算最小生成树的一种算法。和prim算法(上,中,下)按照节点进行查找的方法不一样,克鲁斯卡尔算法是按照具体的线段进行的。
现在我们假设一个图有m个节点,n条边。
首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我们依次取出其中的每一条边,如果发现边的两个节点分别位于两棵树上,那么把两棵树合并成为一颗树;如果树的两个节点位于同一棵树上,那么忽略这条边,继续运行。等到所有的边都遍历结束之后,如果所有的生成树可以合并成一条生成树,那么它就是我们需要寻找的最小生成树,反之则没有最小生成树。
上面的算法可能听上去有些费解,我们可以用一个示例说明一下,
- /*
- * 9
- * D -----------
- * 3 | |
- * | 6 |
- * A ------- B
- * | |
- * | 7 | 5
- * -------C----
- **/
现在有这么4个点。其中 A-D 为3, A-C为7,A-B为6,B-D为9,B-C为5,下面就开始计算,我们首先默认所有的点都是单独的最小生成树,
- /*
- *
- * D
- *
- * A B
- *
- * C
- **/
第一步,按照从小到大的顺序,我们加入最小的边A-D,
- /*
- *
- * D
- * 3 |
- * |
- * A B
- *
- *
- * C
- **/
然后,我们发现下面最小的边是B-C,
- /*
- *
- * D
- * 3 |
- * |
- * A B
- * |
- * | 5
- * C----
- **/
接着,我们发现最小的边是A-B,因为点A和点B位于不同的最小生成树上面,所以继续合并,
- /*
- * D
- * 3 |
- * | 6
- * A---------- B
- * |
- * | 5
- * C----
- **/
接下来,我们还会遍历A-C,B-D,但是我们发现此时边的节点都已经遍历过了,所以均忽略,最小生成树的结构就是上面的内容。
那么最小生成树的数据结构是什么,应该怎么定义,不知道朋友们还记得否?我们曾经在prim算法中讨论过,
- /* 直连边 */
- typedef struct _DIR_LINE
- {
- int start;
- int end;
- int weight;
- struct _DIR_LINE* next;
- }DIR_LINE;
- /* 最小生成树 */
- typedef struct _MINI_GENERATE_TREE
- {
- int node_num;
- int line_num;
- int* pNode;
- DIR_LINE* pLine;
- }MINI_GENERATE_TREE;
- /* 节点边信息 */
- typedef struct _LINE
- {
- int end;
- int weight;
- struct _LINE* next;
- }LINE;
- /*节点信息*/
- typedef struct _VECTEX
- {
- int start;
- int number;
- LINE* neighbor;
- struct _VECTEX* next;
- }VECTEX;
- /* 图信息 */
- typedef struct _GRAPH
- {
- int count;
- VECTEX* head;
- }GRAPH;
克鲁斯卡尔算法是计算最小生成树的一种算法。和prim算法(上,中,下)按照节点进行查找的方法不一样,克鲁斯卡尔算法是按照具体的线段进行的。现在我们假设一个图有m个节点,n条边。首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我们依次取出其中的每一条边,如果发现边的两个节点分别位于两棵树上,那么把两棵树合并成为一颗树;如果树的两个节点位于同一棵树上,那么忽略这条边,继续运行。等到所有的边都遍历结束之后,如果所有的生成树可以合并成一条生成树,那么它就是我们需要寻找的最小生成树,反之则没有最小生成树。
上面的算法可能听上去有些费解,我们可以用一个示例说明一下,
- /*
- * 9
- * D -----------
- * 3 | |
- * | 6 |
- * A ------- B
- * | |
- * | 7 | 5
- * -------C----
- **/
现在有这么4个点。其中 A-D 为3, A-C为7,A-B为6,B-D为9,B-C为5,下面就开始计算,我们首先默认所有的点都是单独的最小生成树,
- /*
- *
- * D
- *
- * A B
- *
- * C
- **/
第一步,按照从小到大的顺序,我们加入最小的边A-D,
- /*
- *
- * D
- * 3 |
- * |
- * A B
- *
- *
- * C
- **/
然后,我们发现下面最小的边是B-C,
- /*
- *
- * D
- * 3 |
- * |
- * A B
- * |
- * | 5
- * C----
- **/
接着,我们发现最小的边是A-B,因为点A和点B位于不同的最小生成树上面,所以继续合并,
- /*
- * D
- * 3 |
- * | 6
- * A---------- B
- * |
- * | 5
- * C----
- **/
接下来,我们还会遍历A-C,B-D,但是我们发现此时边的节点都已经遍历过了,所以均忽略,最小生成树的结构就是上面的内容。
那么最小生成树的数据结构是什么,应该怎么定义,不知道朋友们还记得否?我们曾经在prim算法中讨论过,
- /* 直连边 */
- typedef struct _DIR_LINE
- {
- int start;
- int end;
- int weight;
- struct _DIR_LINE* next;
- }DIR_LINE;
- /* 最小生成树 */
- typedef struct _MINI_GENERATE_TREE
- {
- int node_num;
- int line_num;
- int* pNode;
- DIR_LINE* pLine;
- }MINI_GENERATE_TREE;
- /* 节点边信息 */
- typedef struct _LINE
- {
- int end;
- int weight;
- struct _LINE* next;
- }LINE;
- /*节点信息*/
- typedef struct _VECTEX
- {
- int start;
- int number;
- LINE* neighbor;
- struct _VECTEX* next;
- }VECTEX;
- /* 图信息 */
- typedef struct _GRAPH
- {
- int count;
- VECTEX* head;
- }GRAPH;
克鲁斯卡尔算法思想过程相关推荐
- 最小生成树之克鲁斯卡尔算法
目录 前言 一.克鲁斯卡尔算法构造过程 二.算法实现 1.辅助结构体.数组 2.算法核心 3.排序函数 总结 前言 承接上文普里姆算法,这里的克鲁斯卡尔算法是解决最短联通路径的另一种算法,细节就不多概 ...
- 普利姆算法和克鲁斯卡尔算法求解最小生成树
Q:最小生成树有什么用? A:譬如我要去五个城市旅游,每两个城市之间可能有路也可能没有,路的距离可能一样也可能不一样,随机从一个城市出发,我想要把每个城市走一遍,怎么样走过的路距离最短,比如我想从上海 ...
- 最小生成树——普里姆算法和克鲁斯卡尔算法
最小生成树 用来解决工程中的代价问题. 一:普里姆算法 具体代码用C语言实现如下: typedef int VRType;typedef char InfoType;#define MAX_NAME ...
- c语言克鲁斯卡尔算法
克鲁斯卡尔思路以及代码分析 我们用邻接矩阵来表示该图,克鲁斯卡尔算法思想及找到最小边,查看是否形成回路,若形成回路则这条边不形成,若不形成回路则构成最小路径,以此类推.(思路和代码都在下方) 第一步e ...
- 克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解
基本思想 先构造一个只含 n 个顶点.而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树(不构成回路),则将其加入子图 ...
- 克鲁斯卡尔算法的基本思想
克鲁斯卡尔算法的基本思想: 考虑问题的出发点: 为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小. 具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始, ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- 利用克鲁斯卡尔算法求最小生成树
思路:最小生成树即为无向连通图G的一个子图如果是一颗包含G的所有顶点且权最小的树则称为最小生成树.克鲁斯卡尔算法的基本思想是以边为主导地位,始终选择当前可用的(所选的边不能构成回路)最小权值边.所以第 ...
- 最新生成树之克鲁斯卡尔算法
基本思想:(1)构造一个只含n个顶点,边集为空的子图.若将图中各个顶点看成一棵树的根节点,则它是一个含有n棵树的森林.(2)从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将 ...
最新文章
- 2017最新整理传智播客JavaEE第49期 基础就业班
- php redis 用户注册,redis+php实现微博(一)注册与登录功能详解
- js svg语音波动动画_SVG实现环形进度条的原理
- Idea中内置Translation插件报“翻译错误”,解决方式!!!
- 二叉树-树转二叉树 使用队列,编写transfrom函数,将普通树转换成对应的二叉树。
- 可爱的python测试开发库及项目(python测试开发工具库汇总)
- 基于JAVA+SpringMVC+Mybatis+MYSQL的二手书交易系统
- [20171115]关于逻辑读的疑问.txt
- STM32的AD通道干扰问题
- 小程序源码:酒桌扑克娱乐喝酒小游戏-多玩法安装简单
- 计算机图形学的学习心得,计算机图形学学习心得
- DVWA靶机安装(超详细教程)
- 解决sublime中文输入问题
- 求职简历-机器学习工程师
- 根据当前谷歌浏览器版本获取或更新更新chromedriver.exe
- opencv之subtract
- 虚幻引擎 4 渲染流程分析
- GNU GRUBversion 2.04Minimal BASH-like line editing is supported.For the first word
- 小游戏 《唐僧大战白骨精》
- 计算机转换几种,文件转换 篇一:有多少种文件格式转换的方法,你造吗?