克鲁斯卡尔算法是计算最小生成树的一种算法。和prim算法(上,中,下)按照节点进行查找的方法不一样,克鲁斯卡尔算法是按照具体的线段进行的。

现在我们假设一个图有m个节点,n条边。

首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我们依次取出其中的每一条边,如果发现边的两个节点分别位于两棵树上,那么把两棵树合并成为一颗树;如果树的两个节点位于同一棵树上,那么忽略这条边,继续运行。等到所有的边都遍历结束之后,如果所有的生成树可以合并成一条生成树,那么它就是我们需要寻找的最小生成树,反之则没有最小生成树。

上面的算法可能听上去有些费解,我们可以用一个示例说明一下,

[cpp]  view plain copy
  1. /*
  2. *          9
  3. *    D -----------
  4. *  3 |           |
  5. *    |      6    |
  6. *    A  -------  B
  7. *    |           |
  8. *    |   7       | 5
  9. *    -------C----
  10. **/

现在有这么4个点。其中 A-D 为3, A-C为7,A-B为6,B-D为9,B-C为5,下面就开始计算,我们首先默认所有的点都是单独的最小生成树,

[cpp]  view plain copy
  1. /*
  2. *
  3. *    D
  4. *
  5. *    A           B
  6. *
  7. *          C
  8. **/

第一步,按照从小到大的顺序,我们加入最小的边A-D,

[cpp]  view plain copy
  1. /*
  2. *
  3. *    D
  4. *  3 |
  5. *    |
  6. *    A           B
  7. *
  8. *
  9. *           C
  10. **/

然后,我们发现下面最小的边是B-C,

[cpp]  view plain copy
  1. /*
  2. *
  3. *    D
  4. *  3 |
  5. *    |
  6. *    A           B
  7. *                |
  8. *                | 5
  9. *           C----
  10. **/

接着,我们发现最小的边是A-B,因为点A和点B位于不同的最小生成树上面,所以继续合并,

[cpp]  view plain copy
  1. /*
  2. *    D
  3. *  3 |
  4. *    |     6
  5. *    A---------- B
  6. *                |
  7. *                | 5
  8. *           C----
  9. **/

接下来,我们还会遍历A-C,B-D,但是我们发现此时边的节点都已经遍历过了,所以均忽略,最小生成树的结构就是上面的内容。

那么最小生成树的数据结构是什么,应该怎么定义,不知道朋友们还记得否?我们曾经在prim算法中讨论过,

[cpp]  view plain copy
  1. /* 直连边 */
  2. typedef struct _DIR_LINE
  3. {
  4. int start;
  5. int end;
  6. int weight;
  7. struct _DIR_LINE* next;
  8. }DIR_LINE;
  9. /* 最小生成树 */
  10. typedef struct _MINI_GENERATE_TREE
  11. {
  12. int node_num;
  13. int line_num;
  14. int* pNode;
  15. DIR_LINE* pLine;
  16. }MINI_GENERATE_TREE;
  17. /* 节点边信息 */
  18. typedef struct _LINE
  19. {
  20. int end;
  21. int weight;
  22. struct _LINE* next;
  23. }LINE;
  24. /*节点信息*/
  25. typedef struct _VECTEX
  26. {
  27. int start;
  28. int number;
  29. LINE* neighbor;
  30. struct _VECTEX* next;
  31. }VECTEX;
  32. /* 图信息 */
  33. typedef struct _GRAPH
  34. {
  35. int count;
  36. VECTEX* head;
  37. }GRAPH;

克鲁斯卡尔算法是计算最小生成树的一种算法。和prim算法(上,中,下)按照节点进行查找的方法不一样,克鲁斯卡尔算法是按照具体的线段进行的。现在我们假设一个图有m个节点,n条边。首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我们依次取出其中的每一条边,如果发现边的两个节点分别位于两棵树上,那么把两棵树合并成为一颗树;如果树的两个节点位于同一棵树上,那么忽略这条边,继续运行。等到所有的边都遍历结束之后,如果所有的生成树可以合并成一条生成树,那么它就是我们需要寻找的最小生成树,反之则没有最小生成树。

上面的算法可能听上去有些费解,我们可以用一个示例说明一下,

[cpp]  view plain copy
  1. /*
  2. *          9
  3. *    D -----------
  4. *  3 |           |
  5. *    |      6    |
  6. *    A  -------  B
  7. *    |           |
  8. *    |   7       | 5
  9. *    -------C----
  10. **/

现在有这么4个点。其中 A-D 为3, A-C为7,A-B为6,B-D为9,B-C为5,下面就开始计算,我们首先默认所有的点都是单独的最小生成树,

[cpp]  view plain copy
  1. /*
  2. *
  3. *    D
  4. *
  5. *    A           B
  6. *
  7. *          C
  8. **/

第一步,按照从小到大的顺序,我们加入最小的边A-D,

[cpp]  view plain copy
  1. /*
  2. *
  3. *    D
  4. *  3 |
  5. *    |
  6. *    A           B
  7. *
  8. *
  9. *           C
  10. **/

然后,我们发现下面最小的边是B-C,

[cpp]  view plain copy
  1. /*
  2. *
  3. *    D
  4. *  3 |
  5. *    |
  6. *    A           B
  7. *                |
  8. *                | 5
  9. *           C----
  10. **/

接着,我们发现最小的边是A-B,因为点A和点B位于不同的最小生成树上面,所以继续合并,

[cpp]  view plain copy
  1. /*
  2. *    D
  3. *  3 |
  4. *    |     6
  5. *    A---------- B
  6. *                |
  7. *                | 5
  8. *           C----
  9. **/

接下来,我们还会遍历A-C,B-D,但是我们发现此时边的节点都已经遍历过了,所以均忽略,最小生成树的结构就是上面的内容。

那么最小生成树的数据结构是什么,应该怎么定义,不知道朋友们还记得否?我们曾经在prim算法中讨论过,

[cpp]  view plain copy
  1. /* 直连边 */
  2. typedef struct _DIR_LINE
  3. {
  4. int start;
  5. int end;
  6. int weight;
  7. struct _DIR_LINE* next;
  8. }DIR_LINE;
  9. /* 最小生成树 */
  10. typedef struct _MINI_GENERATE_TREE
  11. {
  12. int node_num;
  13. int line_num;
  14. int* pNode;
  15. DIR_LINE* pLine;
  16. }MINI_GENERATE_TREE;
  17. /* 节点边信息 */
  18. typedef struct _LINE
  19. {
  20. int end;
  21. int weight;
  22. struct _LINE* next;
  23. }LINE;
  24. /*节点信息*/
  25. typedef struct _VECTEX
  26. {
  27. int start;
  28. int number;
  29. LINE* neighbor;
  30. struct _VECTEX* next;
  31. }VECTEX;
  32. /* 图信息 */
  33. typedef struct _GRAPH
  34. {
  35. int count;
  36. VECTEX* head;
  37. }GRAPH;

克鲁斯卡尔算法思想过程相关推荐

  1. 最小生成树之克鲁斯卡尔算法

    目录 前言 一.克鲁斯卡尔算法构造过程 二.算法实现 1.辅助结构体.数组 2.算法核心 3.排序函数 总结 前言 承接上文普里姆算法,这里的克鲁斯卡尔算法是解决最短联通路径的另一种算法,细节就不多概 ...

  2. 普利姆算法和克鲁斯卡尔算法求解最小生成树

    Q:最小生成树有什么用? A:譬如我要去五个城市旅游,每两个城市之间可能有路也可能没有,路的距离可能一样也可能不一样,随机从一个城市出发,我想要把每个城市走一遍,怎么样走过的路距离最短,比如我想从上海 ...

  3. 最小生成树——普里姆算法和克鲁斯卡尔算法

    最小生成树 用来解决工程中的代价问题. 一:普里姆算法 具体代码用C语言实现如下: typedef int VRType;typedef char InfoType;#define MAX_NAME ...

  4. c语言克鲁斯卡尔算法

    克鲁斯卡尔思路以及代码分析 我们用邻接矩阵来表示该图,克鲁斯卡尔算法思想及找到最小边,查看是否形成回路,若形成回路则这条边不形成,若不形成回路则构成最小路径,以此类推.(思路和代码都在下方) 第一步e ...

  5. 克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解

    基本思想 先构造一个只含 n 个顶点.而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树(不构成回路),则将其加入子图 ...

  6. 克鲁斯卡尔算法的基本思想

    克鲁斯卡尔算法的基本思想: 考虑问题的出发点: 为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小. 具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始, ...

  7. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

  8. 利用克鲁斯卡尔算法求最小生成树

    思路:最小生成树即为无向连通图G的一个子图如果是一颗包含G的所有顶点且权最小的树则称为最小生成树.克鲁斯卡尔算法的基本思想是以边为主导地位,始终选择当前可用的(所选的边不能构成回路)最小权值边.所以第 ...

  9. 最新生成树之克鲁斯卡尔算法

    基本思想:(1)构造一个只含n个顶点,边集为空的子图.若将图中各个顶点看成一棵树的根节点,则它是一个含有n棵树的森林.(2)从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将 ...

最新文章

  1. 2017最新整理传智播客JavaEE第49期 基础就业班
  2. php redis 用户注册,redis+php实现微博(一)注册与登录功能详解
  3. js svg语音波动动画_SVG实现环形进度条的原理
  4. Idea中内置Translation插件报“翻译错误”,解决方式!!!
  5. 二叉树-树转二叉树 使用队列,编写transfrom函数,将普通树转换成对应的二叉树。
  6. 可爱的python测试开发库及项目(python测试开发工具库汇总)
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的二手书交易系统
  8. [20171115]关于逻辑读的疑问.txt
  9. STM32的AD通道干扰问题
  10. 小程序源码:酒桌扑克娱乐喝酒小游戏-多玩法安装简单
  11. 计算机图形学的学习心得,计算机图形学学习心得
  12. DVWA靶机安装(超详细教程)
  13. 解决sublime中文输入问题
  14. 求职简历-机器学习工程师
  15. 根据当前谷歌浏览器版本获取或更新更新chromedriver.exe
  16. opencv之subtract
  17. 虚幻引擎 4 渲染流程分析
  18. GNU GRUBversion 2.04Minimal BASH-like line editing is supported.For the first word
  19. 小游戏 《唐僧大战白骨精》
  20. 计算机转换几种,文件转换 篇一:有多少种文件格式转换的方法,你造吗?

热门文章

  1. SpringBoot整合dynamic(全网最舒服)
  2. 深度学习计算框架综述(十三)HVX 计算优化实践—VCAP Hexagon 计算框架介绍
  3. 找一个适合自己的锻炼方法
  4. 旋转编码器的集电极开路输出、电压输出、互补输出和线性驱动输出之间的区别是什么
  5. python mat文件_python变量保存为.mat文件
  6. python爬虫脚本入门-通过电影脚本讲些爬虫知识
  7. 微信小程序设置灰色滤镜
  8. 如何设置textarea文本框中的内容为只读不可修改状态
  9. 原生alert确定取消按钮
  10. 高德纳(Knuth)谈计算机程序设计艺术(下)