最小生成树 Kruskal
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(log2n)
find()
嵌套在一个时间复杂度为O(n)
的for
循环内
所以MST_Kruskal()
的时间复杂度为
O(nlog2n)O(nlog_2n) O(nlog2n)
输出
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相关推荐
- hdu 1863(最小生成树kruskal)
/*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cst ...
- HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...
- hdu 1162(最小生成树kruskal)
/*Name: 最小生成树(kruskal) Author: Date: 10/04/12 19:17 */#include <math.h> #include <cstdio> ...
- 图的最小生成树-Kruskal算法
问题引入 [问题描述] 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法. [输入形式] 输入图的顶点序列及图的边的情况.如样例所示.边的输入以输入-1,-1,-1作为结束 ...
- 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法
基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...
- 最小生成树kruskal算法
最小生成树kruskal算法 概述 算法分析 代码 概述 克鲁斯卡尔(Kruskal)(Kruskal)(Kruskal)算法是求连通网的最小生成树的另一种方法.与普里姆(Prim)(Prim)(Pr ...
- 实现最小生成树Kruskal算法(附完整代码)
实现最小生成树Kruskal算法(附完整代码) Kruskal算法是一种常见的计算最小生成树的算法.它的主要思想是将所有的边按照权值从小到大进行排序,并逐个加入到生成树中,如果加入后不会形成环,则保留 ...
- Contest Hunter CH6201 走廊泼水节 最小生成树 Kruskal
$ \rightarrow $ 戳我进CH原题 走廊泼水节 0x60「图论」例题 总时限10 s $ \quad $ 总内存256 MiB 描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边, ...
- 最小生成树kruskal算法并查集版 C语言实现
今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...
- 图论(九)最小生成树-Kruskal算法
前面说过,Kruskal是从最短边着手构建最小生成树的.其基本过程是:先对图中的所有边按照权重值从小到大进行排序,然后着手选取边构建最小生成树.如果直接从小到大按顺序选取,有可能形成了环,所以对环的处 ...
最新文章
- 计算机学硕哪些学校好考,什么学校研究生好考,计算机专业研究生哪个学校好考一点...
- 有这么一群人,他们通过AI撬动世界!
- JBPM使用assignHandler进行用户分派思路
- (转)RTSP协议详解
- java和python哪个好就业2020-Python和JAVA的就业前景哪个好点?
- Smack类库最好的学习资料
- 5月第2周编辑部标题训练:寻找读者最关注的新闻点
- 接口测试工具postman(六)添加变量(参数化)
- 真涨工资了:多所高校博士生资助标准大幅度提升
- 打造超酷的PHP数据饼图
- 算法笔记_面试题_7.颜色分类/荷兰三色旗问题
- matlab 脚本文件 函数,Matlab 脚本文件script和函数文件function的区别
- nacos启动报错 db.num is null【已解决】
- 局域网服务器传输大文件方案,局域网快速传输大文件【操作方案】
- Nexus下载、安装与使用
- 无线路由器和有线路由器桥接
- 图深度学习模型进展和在阿里搜索广告中的应用创新
- 解决电脑端微信浏览器不支持vue、axios等问题
- yiui易柚7 是Android什么版本,康佳YIUI易柚操作系统
- 班主任工作总结 初中物资管理工作总结
热门文章
- 标题:我的中医自学历程(2013.8.26 更新网盘,欢迎下载和传播)
- vs 搭建团队项目服务器,tfs中如何创建团队项目及如何操作团队项目
- WIN10 下 autocad2006 及其他版本打开文件多窗口不能一个窗口的解决办法
- 由四个坐标位置计算中心点和旋转角度
- 计算机solidwork实训报告,solid works学习心得范文
- 大数据可视化-Tableau
- 【人脸表情识别】基于matlab GUI微表情识别系统【含Matlab源码 1852期】
- 2017计算机办公自动化试题,【2017年整理】计算机办公自动化试题.doc
- win10家庭版将中文用户名修改为英文
- 本人亲身实践,不要给软屏幕笔记本贴钢化膜(T_T)