从边的角度求网的最小生成树,时间复杂度为 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理解+代码解析相关推荐

  1. 番外篇15:libevent简单理解(附libevent官方代码解析,和跨平台服务器、客户端链接代码)

    文章目录 一.事件event和事件管理器event_base介绍 二.libevent流程简介(注册->检测->分派) 三.libevent的好处 四.代码比较 4.1 原来reactor ...

  2. 关于Transformer你需要知道的都在这里------从论文到代码深入理解BERT类模型基石(包含极致详尽的代码解析!)

    UPDATE 2.26.2020 为代码解析部分配上了Jay Ammar The Illustrated GPT-2 的图示,为想阅读源码的朋友缓解疼痛! 深入理解Transformer------从 ...

  3. CornerNet代码解析——损失函数

    CornerNet代码解析--损失函数 文章目录 CornerNet代码解析--损失函数 前言 总体损失 1.Heatmap的损失 2.Embedding的损失 3.Offset的损失 前言 今天要解 ...

  4. 编写易于理解代码的六种方式

    http://www.ibm.com/developerworks/cn/linux/l-clear-code/ 我学习编写.改善和维护代码的过程是很艰苦的.在过去的 12 年里,我一直在编写计算机游 ...

  5. Linux-0.00 代码解析(四)

    Linux 0.00 的编译.运行.源码下载: http://blog.csdn.net/longintchar/article/details/78757065 Linux 0.00 Makefil ...

  6. python断言assert实例_Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...

  7. 【教程】nrf51822实例代码解析及修改实例

    [教程]nrf51822实例代码解析及修改实例 http://www.eeboard.com/bbs/thread-42757-1-1.html 说在前面:此说明用于nrf51822的主从机的实例代码 ...

  8. 对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析

    GAN作为生成模型的一种新型训练方法,通过discriminative model来指导generative model的训练,并在真实数据中取得了很好的效果.尽管如此,当目标是一个待生成的非连续性序 ...

  9. PX4代码解析(5)

    一.前言 我所讨论的PX4代码是基于v1.11版本,该版本与之前的版本有不少不同,其中一个比较大的区别在于新版本大部分用到了C++中模板,使得代码没有以前那么容易理解,因此我在后面介绍PX4的姿态估计 ...

最新文章

  1. Anchor Boxes示例实战
  2. linux c 笔记 文件(三)
  3. 使用Docfx生成项目文档
  4. matlab中uint16(uint8)函数的用法
  5. python读取文件名有中文_[请教]python的中文文件名处理
  6. 知识竞赛现场管理系统安装配置及使用疑难问题汇编
  7. 输出100以内奇数和、偶数和(for和while两种)
  8. k线必涨的20种形态图
  9. 苹果开发:开发证书都显示“此证书的签发者无效”的解决方法
  10. 唤醒手腕Python全栈工程师学习笔记(人工智能篇)
  11. 溢出的文字用省略号表示。
  12. 监控不同外挂盘的硬盘io、查看linux命令运行时间和记录、iostat命令查看硬盘io、查看硬盘io的几种方法、定位到硬盘io高的dm
  13. Windows环境下Nginx配置本地虚拟域名和Nginx代理
  14. [软考]软考教程+历年真题
  15. matlab code svm,SVM matlab 代码详解说明
  16. node之request模块
  17. 《机器学习》周志华课后习题答案——第一章(1-3题完结)
  18. 一个量化交易策略师的自
  19. 弱人工智能阶段,优必选融资重视生态布局
  20. 贝叶斯公式的前世今生

热门文章

  1. 在线预览doc,docx文档
  2. ubuntu 检测网络状态命令
  3. ORACLE的sql语句查询一对一,一对多,多对多
  4. 感动,我终于学会了用Java对数组求和
  5. LinkedList一定比ArrayList的插入和删除效率高吗
  6. unity hdrp的TAA
  7. ubuntu 运行c语言文件路径,ubuntu上解压目录里的文件到指定文件夹
  8. Delphi中类的VMT
  9. html中微信添加好友超链接,微信给文字加链接代码分享(原来微信超链接是这样加的)...
  10. 今日头条阅读量怎么刷_今日头条推广 今日头条阅读量怎么刷