Kruskal理解+代码解析
从边的角度求网的最小生成树,时间复杂度为 O(eloge)。和普里姆算法相反,更适合于求边稀疏的网的最小生成树。
算法核心:
将所有边由小到大排序,从最小的取边,每次取边判断边两端的点能否是其构成回路,如果能构成回路,则继续下一条(即该条边不取)。直到n个顶点取完n-1条边。
判断是否构成回路就需要运用并查集
并查集是将有关联的元素放入一个集合的东西,我们借此来判断是否成环。
这里采用的是无权并查集
使用父亲结点,即P[i]=j;表示i的父亲结点为j;
初始化时,将每个结点都指向自己;
我们在取边时,连接的应该是他们的根结点(以防成环)
因此需要建立fing()来寻找根节点。
int find(int x)//查找并查集,即查找根节点
{if (f[x] == x)return x;else{f[x] = find(f[x]);return f[x];}
}
主要代码:
struct edge {int x;int y;int w;
}em[mmax];//建立边int f[mmax], cnt, m, n, ans;bool cmp(edge x, edge y)
{return x.w < y.w;
}int find(int x)//查找并查集,即查找根节点
{if (f[x] == x)return x;else{f[x] = find(f[x]);return f[x];}
}void kurskal()
{ans = 0;cnt = 0;sort(em + 1, em + m + 1, cmp);//依据边的大小重新排序for (int i = 1; i <= m; i++){int u = find(em[i].x);//寻找父节点int v = find(em[i].y);if (u == v)//如果父节点相同,则意味着相连成环,应该舍去continue;ans += em[i].w;f[v] = u;//加入树中,形成父节点cnt++;//用于计算已填入的边的数量if (cnt == n - 1)break;}
}int main(void)
{while (~scanf("%d%d",&n,&m) && n&&m){memset(f, 0, sizeof(f));for (int i = 1; i <= n; i++)f[i] = i;for (int i = 1; i <= m; i++)scanf("%d%d%d%d", &em[i].x, &em[i].y, &em[i].w, &fare);kurskal();printf("%d\n", ans);}return 0;
}
Kruskal理解+代码解析相关推荐
- 番外篇15:libevent简单理解(附libevent官方代码解析,和跨平台服务器、客户端链接代码)
文章目录 一.事件event和事件管理器event_base介绍 二.libevent流程简介(注册->检测->分派) 三.libevent的好处 四.代码比较 4.1 原来reactor ...
- 关于Transformer你需要知道的都在这里------从论文到代码深入理解BERT类模型基石(包含极致详尽的代码解析!)
UPDATE 2.26.2020 为代码解析部分配上了Jay Ammar The Illustrated GPT-2 的图示,为想阅读源码的朋友缓解疼痛! 深入理解Transformer------从 ...
- CornerNet代码解析——损失函数
CornerNet代码解析--损失函数 文章目录 CornerNet代码解析--损失函数 前言 总体损失 1.Heatmap的损失 2.Embedding的损失 3.Offset的损失 前言 今天要解 ...
- 编写易于理解代码的六种方式
http://www.ibm.com/developerworks/cn/linux/l-clear-code/ 我学习编写.改善和维护代码的过程是很艰苦的.在过去的 12 年里,我一直在编写计算机游 ...
- Linux-0.00 代码解析(四)
Linux 0.00 的编译.运行.源码下载: http://blog.csdn.net/longintchar/article/details/78757065 Linux 0.00 Makefil ...
- python断言assert实例_Python断言assert的用法代码解析
在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...
- 【教程】nrf51822实例代码解析及修改实例
[教程]nrf51822实例代码解析及修改实例 http://www.eeboard.com/bbs/thread-42757-1-1.html 说在前面:此说明用于nrf51822的主从机的实例代码 ...
- 对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
GAN作为生成模型的一种新型训练方法,通过discriminative model来指导generative model的训练,并在真实数据中取得了很好的效果.尽管如此,当目标是一个待生成的非连续性序 ...
- PX4代码解析(5)
一.前言 我所讨论的PX4代码是基于v1.11版本,该版本与之前的版本有不少不同,其中一个比较大的区别在于新版本大部分用到了C++中模板,使得代码没有以前那么容易理解,因此我在后面介绍PX4的姿态估计 ...
最新文章
- Anchor Boxes示例实战
- linux c 笔记 文件(三)
- 使用Docfx生成项目文档
- matlab中uint16(uint8)函数的用法
- python读取文件名有中文_[请教]python的中文文件名处理
- 知识竞赛现场管理系统安装配置及使用疑难问题汇编
- 输出100以内奇数和、偶数和(for和while两种)
- k线必涨的20种形态图
- 苹果开发:开发证书都显示“此证书的签发者无效”的解决方法
- 唤醒手腕Python全栈工程师学习笔记(人工智能篇)
- 溢出的文字用省略号表示。
- 监控不同外挂盘的硬盘io、查看linux命令运行时间和记录、iostat命令查看硬盘io、查看硬盘io的几种方法、定位到硬盘io高的dm
- Windows环境下Nginx配置本地虚拟域名和Nginx代理
- [软考]软考教程+历年真题
- matlab code svm,SVM matlab 代码详解说明
- node之request模块
- 《机器学习》周志华课后习题答案——第一章(1-3题完结)
- 一个量化交易策略师的自
- 弱人工智能阶段,优必选融资重视生态布局
- 贝叶斯公式的前世今生