参考文章

介绍

第一次听说这个算法。。
对于最小生成树一定学过prim和krusal,prim复杂度是O(n2)或者O(elogn)O(n^2)或者O(elogn)O(n2)或者O(elogn),krusal复杂度是O(eloge)O(eloge)O(eloge),这里介绍一下Boruvka算法
Boruvka算法解决某些特定问题非常好用:
给定n个点,每个点都有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出(例如两点权之差),求最小生成树
点的数量为n,边的数量为n^2,当n=1e5,prim和Krusal都会超时,现在用Boruvka求最小生成树的算法:
考虑维护当前的连通块(初始每个点为独立的一个连通块)
对于每个连通块,找到一条与该连通块相连的,且另一端点不在此连通块中的边权最小的边
将所有的这些边加入到最小生成树,注意,当加入一个边时需要判断该点的两端点是否在同一连通块内。
重复若干遍上述操作,直到图连通
复杂度分析:每次连通块的个数至少减半,复杂度为O((n+m)logn),并查集操作是O(1)
本算法不常用于求裸的最小生成树(因为Krusal更好用)
在给出的题目情况中,我们只需要求出每个连通块相连的边权的最小边即可,在这种类型的题目中,这个东西的复杂度一般是O(nlogn)
所以可以在O(nlog2n)O(nlog^2n)O(nlog2n)的复杂度下解决此类问题

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
inline int read()
{int x= 0;int w= 0;char ch= 0;while (ch < '0' || ch > '9')w|= ch == '-', ch= getchar();while (ch >= '0' && ch <= '9')x= (x << 3) + (x << 1) + (ch ^ 48), ch= getchar();return w ? (-x) : x;
}
#define mp make_pair
const int N= 200005;
const int M= 500005;
const LL inf= 1e12;
int f[N], pd, n, m;
struct node
{int a, b;LL c;
} e[M];
pair<LL, LL> E[N];
int find(int k)
{return (k == f[k]) ? k : f[k]= find(f[k]);
}
LL Boruvka()
{LL res= 0;pd= 1;int num= 0;for (int i= 1; i <= n; i++)f[i]= i;while (num < n - 1) {int tmp= 0;for (int i= 1; i <= n; i++)E[find(i)]= mp(inf, inf);for (int i= 1; i <= m; i++) {int fa= find(e[i].a);int fb= find(e[i].b);if (fa == fb)continue;tmp++;//取最小的边,最小边一样取最小编号 E[fa]= min(E[fa], mp(e[i].c, i * 1ll)); E[fb]= min(E[fb], mp(e[i].c, i * 1ll));}if (tmp == 0)break;for (int i= 1; i <= m; i++) {int fa= find(e[i].a);int fb= find(e[i].b);if (fa == fb)continue;if ((E[fa] == mp(e[i].c, i * 1ll)) || (E[fb] == mp(e[i].c, i * 1ll))) {f[fa]= fb;res+= e[i].c;num++;}}}if (num < n - 1)pd= 0;return res;
}
int main()
{scanf("%d%d", &n, &m);for (int i= 1; i <= m; i++)scanf("%d%d%lld", &e[i].a, &e[i].b, &e[i].c);LL ans= Boruvka();if (!pd)printf("orz\n");elseprintf("%lld\n", ans);return 0;
}

题目:

CF1550F Jumping Around

最小生成树--Boruvka算法相关推荐

  1. 【YBT2023寒假Day13 C】百里守约(Boruvka算法)(扫描线)(线段树)

    百里守约 题目链接:YBT2023寒假Day13 C 题目大意 有一个 n*n 的矩阵,一开始里面都是 0,多次操作,每次把一个子矩阵里面的值都增加每次给出的 w. 然后全部操作完之后构造一个 n 个 ...

  2. 【数据结构与算法】图结构最小生成树Kruskal算法的Java实现

    Kruskal算法 Kruskal算法是图论中用于求解最小生成树的算法,算法时间复杂度为O(eloge) 比较起Prim算法,Kruskal算法虽然同求最小生成树,却更适合稀疏网. 这里图的储存结构建 ...

  3. 最小生成树 Kruskal算法 Prim算法

    文章目录 Kruskal算法 模板: Prim算法 模板: Kruskal算法 模板: https://blog.csdn.net/Rain722/article/details/65642992 K ...

  4. * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法

    文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...

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

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

  6. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  7. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

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

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

  9. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

最新文章

  1. spark2.1:rdd.combineByKeyWithClassTag的用法示例
  2. Xcode中Info.plist文件各个键的作用说明【搜藏】
  3. 雨棚板弹性法计算简图_钢结构工程量计算4点注意事项,还不来看?
  4. CachedIntrospectionResults 初始化
  5. TX2017秋招笔试题之编码
  6. 【MEMORY ALIGN】内存对齐
  7. iOS开发多线程篇—NSOperation基本操作
  8. React Router 全部
  9. rgba 和 IE 的 filter数值转换
  10. 关于求极限对几个问题的思考和总结
  11. tomcat热部署(springboot项目)
  12. PWM的基本原理及应用实例
  13. Sketch for mac|矢量绘图设计
  14. 俞敏洪沉默,新东方落泪
  15. 刷入twrp_twrp刷入面具进入recovery(twrp)的方式获取root刷入第三方rom获取第三方rom包类原生rom包的网络连接受限问题
  16. pthon图片信息-3cv2-高阶处理
  17. [解决方案]excel2010分析工具库无法运行“ FUNCRES.NLAM! Showatpdialog”宏
  18. [人工智能-深度学习-61]:生成对抗网络GAN - 图像融合的基本原理与案例
  19. python取列表中位数_详解Python如何获取列表(List)的中位数
  20. 你好,李焕英!贾玲痛哭,一句话戳痛2.3亿中国人

热门文章

  1. 一人之力也能抬起一辆大型箱车?
  2. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你
  3. 100 万在中国不同地方能活多久?
  4. linux at java,Linux-Tutorial/Java-bin.md at master · linsanityHuang/Linux-Tutorial · GitHub
  5. excel保存成matlab,matlab数据保存为excel文件
  6. linux内核线程socket,从Linux源码看Socket(TCP)的accept
  7. mysql 存储二进制数据_为什么在MySQL中存储二进制数据?
  8. 项目进度计划甘特图_项目管理进度计划表制作及甘特图绘制方法
  9. c#事件的发布-订阅模型_微信灰度测试订阅号付费功能,小米推出最便宜5G套餐,腾讯辟谣高管猝死赔钱事件,核心期刊发布十岁儿童文章,这就是今天的其他大新闻!...
  10. groovy 字符串截取最后一个_Python入门高级教程--Python 字符串