Kruskal算法比起Prim算法还要更贪心一些

Prim算法以某个顶点为起点,在这个顶点附近找权重最小的边;而Kruskal算法只要当前图中权重最小的边

Kruskal算法

Kruskal算法的思路是:把森林合并成树

最开始时,我们把所有的顶点看做是一棵树的根节点,总共有n棵树

整个图中,(v4, v7)的权重是最小的,从这里开始






这里要注意,尽管(v6, v5)、(v2, v1)的权重比(v6, v7)小,但选了前两个会形成回路

至此,最小生成树构建完成

存储结构

在Kruskal算法中,使用边集数组,提高对边处理的效率

typedef struct _edge {int begin;int end;int weight;
}edge;

边集合按照边集数组形式存储,每条边按照权重从小到大顺序排列

edge begin end weight
0 0 1 10
1 0 5 11
2 1 2 18
3 1 6 16
4 1 8 12
5 2 3 22
6 2 8 8
7 3 4 20
8 3 6 24
9 3 7 16
10 3 8 21
11 4 5 26
12 4 7 7
13 5 6 17
14 6 7 19

加上顶点集合就是一张完整的图

typedef int VexType;
typedef struct _egraph {VexType* vex;edge* Arc;int num_vexs;int num_edge;
}egraph;

输入

  • 第一行给出顶点个数边的条数
  • 第二行给出顶点元素的值
  • 之后给出边集数组,数据按照下面的格式给出
起点 终点 权重
9 14
0 1 2 3 4 5 6 7 8
4 7 7
2 8 8
0 1 10
0 5 11
1 8 12
1 6 16
3 7 16
5 6 17
1 2 18
6 7 19
3 4 20
3 8 21
2 3 22
3 6 24
4 5 26

图的转化和排序是Kruskal算法的一部分,为了偷懒 简化把这部分工作扔给输入了

void MST_Kruskal(egraph* e) {int* parent;  // 用来判断边与边是否会形成回路parent = new int[e->num_vexs]();   //加上圆括号调用构造函数, 初始化数组全为0int m, n;for (int i = 0; i < e->num_edge; i++) {n = find(parent, e->Arc[i].begin);m = find(parent, e->Arc[i].end);if (n != m) {   //不相等说明没有形成回路, 将这条边并入MSTparent[n] = m;cout << e->Arc[i].begin << ' ' << e->Arc[i].end << ' ' << e->Arc[i].weight << endl;}}delete[] parent;
}int find(int* parent, int f) {  //从给定的节点向其根节点回溯, 找到连线的尾巴while (parent[f] > 0) {f = parent[f];}return f;
}

假设有总共有n条边
find()的时间复杂度
O(log2n)O(log_2n) O(log2​n)
find()嵌套在一个时间复杂度为O(n)for循环内

所以MST_Kruskal()的时间复杂度为
O(nlog2n)O(nlog_2n) O(nlog2​n)

输出

4 7 7
2 8 8
0 1 10
0 5 11
1 8 12
1 6 16
3 7 16
6 7 19

Prim和Kruskal的总结

  • Prim适合处理稠密图
  • Kruskal适合处理稀疏图

最小生成树 Kruskal相关推荐

  1. hdu 1863(最小生成树kruskal)

    /*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cst ...

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

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

  3. hdu 1162(最小生成树kruskal)

    /*Name: 最小生成树(kruskal) Author: Date: 10/04/12 19:17 */#include <math.h> #include <cstdio> ...

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

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

  5. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

    基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...

  6. 最小生成树kruskal算法

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

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

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

  8. Contest Hunter CH6201 走廊泼水节 最小生成树 Kruskal

    $ \rightarrow $ 戳我进CH原题 走廊泼水节 0x60「图论」例题 总时限10 s $ \quad $ 总内存256 MiB 描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边, ...

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

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

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

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

最新文章

  1. 计算机学硕哪些学校好考,什么学校研究生好考,计算机专业研究生哪个学校好考一点...
  2. 有这么一群人,他们通过AI撬动世界!
  3. JBPM使用assignHandler进行用户分派思路
  4. (转)RTSP协议详解
  5. java和python哪个好就业2020-Python和JAVA的就业前景哪个好点?
  6. Smack类库最好的学习资料
  7. 5月第2周编辑部标题训练:寻找读者最关注的新闻点
  8. 接口测试工具postman(六)添加变量(参数化)
  9. 真涨工资了:多所高校博士生资助标准大幅度提升
  10. 打造超酷的PHP数据饼图
  11. 算法笔记_面试题_7.颜色分类/荷兰三色旗问题
  12. matlab 脚本文件 函数,Matlab 脚本文件script和函数文件function的区别
  13. nacos启动报错 db.num is null【已解决】
  14. 局域网服务器传输大文件方案,局域网快速传输大文件【操作方案】
  15. Nexus下载、安装与使用
  16. 无线路由器和有线路由器桥接
  17. 图深度学习模型进展和在阿里搜索广告中的应用创新
  18. 解决电脑端微信浏览器不支持vue、axios等问题
  19. yiui易柚7 是Android什么版本,康佳YIUI易柚操作系统
  20. 班主任工作总结 初中物资管理工作总结

热门文章

  1. 标题:我的中医自学历程(2013.8.26 更新网盘,欢迎下载和传播)
  2. vs 搭建团队项目服务器,tfs中如何创建团队项目及如何操作团队项目
  3. WIN10 下 autocad2006 及其他版本打开文件多窗口不能一个窗口的解决办法
  4. 由四个坐标位置计算中心点和旋转角度
  5. 计算机solidwork实训报告,solid works学习心得范文
  6. 大数据可视化-Tableau
  7. 【人脸表情识别】基于matlab GUI微表情识别系统【含Matlab源码 1852期】
  8. 2017计算机办公自动化试题,【2017年整理】计算机办公自动化试题.doc
  9. win10家庭版将中文用户名修改为英文
  10. 本人亲身实践,不要给软屏幕笔记本贴钢化膜(T_T)