基本思路:

用定点数组记录每个子树的最近邻居。

对于每一条边进行处理:

如果这条边连成的两个顶点同属于一个集合,则不处理,否则检测这条边连接的两个子树,如果是连接这两个子树的最小边,则更新 (合并)。

时间复杂度平均 \(O(V+E)\),最坏 \(O((V+E)\log V)\)。

下面是 Borůvka 算法演示动图:(源:Wikimedia)

程序代码:

struct node {int x, y, w; } edge[M];
int d[N];   // 各子树的最小连外边的权值
int e[N];   // 各子树的最小连外边的索引
bool v[M];  // 防止边重复统计int fa[N];
int find(int x) {return x==fa[x] ? x : (fa[x]=find(fa[x])); }
void join(int x, int y) {fa[find(x)]=find(y); }int Boruvka() {int tot=0;for (int i=1; i<=n; ++i) fa[i]=i;while (true) {int cur=0;for (int i=1; i<=n; ++i) d[i]=inf;for (int i=1; i<=m; ++i) {int a=find(edge[i].x), b=find(edge[i].y), c=edge[i].w;if (a==b) continue;cur++;if (c<d[a] || c==d[a] && i<e[a]) d[a]=c, e[a]=i;if (c<d[b] || c==d[b] && i<e[b]) d[b]=c, e[b]=i;}if (cur==0) break;for (int i=1; i<=n; ++i) if (d[i]!=inf && !v[e[i]]) {join(edge[e[i]].x, edge[e[i]].y), tot+=edge[e[i]].w;v[e[i]]=true;}}return tot;
}

转载于:https://www.cnblogs.com/greyqz/p/9536352.html

Borůvka (Sollin) 算法求 MST 最小生成树相关推荐

  1. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)

    题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...

  2. Prim算法 求出 最小生成树

    MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一 ...

  3. python最小生成树算法_图算法|Prim算法求最小生成树

    01 - 一个实际问题 要在n个城市之间铺设光缆,要求有2个: 这 n 个城市的任意两个之间都可以通信: 铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此要使铺设光缆的总费用最低. 如下所示 ...

  4. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  5. prim算法求最小生成树_克鲁斯卡尔算法(Kruskal算法)求最小生成树

    上一节介绍了求最小生成树之普里姆算法.该算法从顶点的角度为出发点,时间复杂度为O(n2),更适合与解决边的绸密度更高的连通网.本节所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(e ...

  6. C语言实现克鲁斯卡尔Kruskal算法求最小生成树(附完整源码)

    Kruskal算法求最小生成树 Edge结构体,Graph结构体 Kruskal算法求最小生成树完整源码(定义,实现,main函数测试) Edge结构体,Graph结构体 // a structure ...

  7. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

  8. 数据结构题:克鲁斯卡尔(Kruscal)算法求最小生成树

    文章目录 前言 一.目的与要求 设计目的 设计要求 二.原理及方案 1.克鲁斯卡尔(Kruskal)算法 2.方案思路 三.设计过程 四.设计结果 五.例题测试 总结 结语 前言 问题描述:用克鲁斯卡 ...

  9. 采用普里姆算法求最小生成树

    目的:领会普里姆算法求带权连通图中最小生成树的过程和相关算法设计. 内容:编写一个程序exp8-5.cpp,实现求带权连通图最小生成树的普里姆算法.对于如图8.55所示的带权连通图G,输出从顶点0出发 ...

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

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

最新文章

  1. WEB攻击手段及防御第2篇-SQL注入
  2. android sdk 源码解析
  3. 安卓期末作品小项目_北京部编版八年级上册语文期末试卷
  4. kali linux怎么编译软件包,如何解决Kali Linux apt-get安装:E:无法找到软件包checkinstall...
  5. vue js table colspan rowspan
  6. 20190720学习小结
  7. 未能找到文件“\bin\roslyn\csc.exe”
  8. 乐山计算机学校新歌王,星歌王第二季乐山市计算机学校专场赛决赛完美落幕!...
  9. 拒绝卡顿——在WPF中使用多线程更新UI
  10. 武汉经济技术开发区建筑业企业高管人才奖励认定时间、条件、材料、程序指导
  11. ctfmon是什么启动项_我MSCONFIG启动项里面没有ctfmon怎么处理?
  12. 黑客帝国里的酷炫蓝光屏幕
  13. Cox回归列线图(nomogram)的多种绘制方法
  14. 网站页面要怎么设计?
  15. Spring Boot - 开启 HttpBasic 认证方式
  16. flask_mail通过qq发送邮箱
  17. 语义分割标签npy文件保存为图片的几种方式详细讨论
  18. golang元转分、分转元
  19. 利用苹果手机轻松查询QQ闪照可随时查看方法
  20. 基于Java的超市管理系统源码,数据库MySQL(附加论文13000字)

热门文章

  1. 小程序打开速度慢是服务器原因吗,网页打开速度慢的原因以及解决方法
  2. spyder python调试_Spyder如何调试
  3. python数据采集2-HTML解析
  4. 排列组合 C语言函数,排列组合c怎么算 计算方法是什么
  5. Marshmallow详解
  6. MySQL中通过经纬度查询地址
  7. python爬取微博图片教程_python实现爬取微博相册所有图片
  8. 因果效应,典型模型及wasserstein距离, BNN,CFR,SITE,NetDeconf
  9. 亲自用鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生....
  10. 网络狂飙2(netspeeder2) v2.0 游戏版 怎么用