boruvka 快速计算最小生成树
时间:2021-08-23
本文章向大家介绍boruvka 快速计算最小生成树,主要包括boruvka 快速计算最小生成树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Boruvka算法求最小生成树
算法的核心思想是贪心,类似于 \(kruskal\)
算法过程:
- 维护途中所有联通块,然后遍历所有点和边。
- 找到每一个联通块和其他联通块相连的最小的一条边。
- 把连通块合并起来,重复操作,直到剩下一整个连通块。
复杂度分析:
复杂度是 \(O((m+n)log n)\) ,每次合并两个连通块,进行 \(log\) 次就能完成。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int nxt[N],ver[N],tot,edge[N],head[N];
int n,m,fa[N],mn[2][N],ans;
/*
mn第一维存fx这个节点距离其他节点最小的长度
第二维存当前连通块的缩点的点
*/
void add(int x,int y,int z){
ver[++tot]=y; edge[tot]=z; nxt[tot]=head[x]; head[x]=tot;
}
int get(int x){
if(x==fa[x]) return x;
else return fa[x]=get(fa[x]);
}
void merge(int x,int y){
int fx=get(x),fy=get(fy); fa[fx]=fy;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z);
}
while(1){
memset(mn[0],127,sizeof(mn[0])); bool flag=0;
for(int x=1;x<=n;x++)
for(int i=head[x];i;i=nxt[i]){
int y=ver[i],fx=get(x),fy=get(y);
if(fx==fy) continue;
if(mn[0][fx]>edge[i]){
mn[0][fx]=edge[i];
mn[1][fx]=fy;
}
}
for(int i=1;i<=n;i++)
if(mn[0][i]!=mn[0][0]&&get(i)!=get(mn[1][i]))
flag=1,ans+=mn[0][i],merge(i,mn[1][i]);
if(!flag) break;
}
for(int i=1;i<n;i++) if(get(i)!=get(i+1)){
puts("NO"); return 0;
}
cout<<ans<<endl;
return 0;
}
原文地址:https://www.cnblogs.com/guanlexiangfan/p/15178069.html
- 你很有想法,跟我学做菜吧No.3
- 《数据结构》 定长顺序串常用操作代码集合
- 一斤代码深入理解系列(七):微信小程序中使用微信风格样式库-WeUI
- 餐厅老板要累疯了No.2
- linux学习第十九篇:压缩介绍,gzip,bzip2,xz压缩工具
- 区块链?黑人问号?NO.1
- linux学习第二十一篇:安装软件包的三种方法,rpm,yum工具用法,yum搭建本地仓库
- iOS使用自签名证书实现HTTPS请求
- 《Java程序设计基础》 第7章手记
- linux学习第二十三篇:shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向
- Python yield关键字 和 Generator(生成器)
- linux学习第二十篇:zip压缩,tar打包以及打包压缩
- 数据结构之图
- 您需要来一份82年的代理吗?No.12
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 最大子序列和的问题的解(1)
- 10-STM32+ESP8266+AIR202远程升级方案-功能3-手机APP控制STM32远程更新固件程序,基于ESP8266
- 最大子序列和的接口函数(2)
- 最大子序列和的接口函数(3)
- 【剑指Offer】二叉树的深度
- 运行时间中的对数
- IIC协议
- 通过例子学习编写shell
- 【redis6.0.6】redis源码慢慢学,慢慢看 -- 第三天:MakeFile
- 继续学习Shell脚本(详细)
- 将linux终端的输出信息保存到log中
- UNIX网络编程卷1(第三版)一个简单的时间获取服务器的程序
- Python数据分析实战(3)Python实现数据可视化
- xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
- 数据结构之树