Boruvka算法求最小生成树
学习了一个新的最小生成树的算法,Boruvka(虽然我不知道怎么读)。算法思想也是贪心,类似于Kruskal。
大致是这样的,我们维护图中所有连通块,然后遍历所有的点和边,找到每一个连通块和其他连通块相连的最小的一条边,然后把连通块合并起来,重复这个操作,直到剩下一整个连通块,最开始状态是每个点是一个单独的连通块。
复杂度是(n+m)longn,因为每次都会合并两个连通块,整个程序进行log次操作就会完成,每次操作的复杂度是n+m的。
代码非常好理解,我用的并查集实现,(然而并查集我没有用按秩合并,都是细节)。——by VANE
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
int pre[M<<],other[M<<],last[N],l,len[M<<];
int n,m;
void add(int x,int y,int z)
{
++l;pre[l]=last[x];last[x]=l;other[l]=y;len[l]=z;
}
int f[N],mn[][N];
int getfa(int x)
{
return x==f[x]?x:f[x]=getfa(f[x]);
}
void merge(int x,int y)
{
int fx=getfa(x),fy=getfa(y);
f[fx]=fy;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) f[i]=i;
for(int i=;i<=m;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
int ans=;
while()
{
memset(mn[],,sizeof mn[]);
bool flag=;
for(int i=;i<=n;++i)
{
for(int p=last[i];p;p=pre[p])
{
if(getfa(i)!=getfa(other[p]))
if(mn[][getfa(i)]>len[p])
{
mn[][getfa(i)]=len[p];
mn[][getfa(i)]=getfa(other[p]);
}
}
}
for(int i=;i<=n;++i)
{
if(mn[][i]!=mn[][]&&getfa(i)!=getfa(mn[][i]))
{
flag=;
ans+=mn[][i];
merge(i,mn[][i]);
}
}
if(!flag) break;
}
for(int i=;i<n;++i)
if(getfa(i)!=getfa(i+))
{
puts("orz");
return ;
}
cout<<ans;
}
Boruvka算法求最小生成树的更多相关文章
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Kruskal和Prim算法求最小生成树
Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...
- 利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构
题目:聪明的猴子 链接:https://ac.nowcoder.com/acm/problem/19964 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个 ...
- prime算法求最小生成树(畅通工程再续)
连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...
- 克鲁斯卡尔(Kruskal)算法求最小生成树
/* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...
- Prim算法和Kruskal算法求最小生成树
Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...
- Prime算法 与 Kruskal算法求最小生成树模板
算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...
- 859. Kruskal算法求最小生成树(模板)
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给定一张边带权的无向图G=(V, E),其中V表示 ...
- 858. Prim算法求最小生成树(模板)
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给定一张边带权的无向图G=(V, E),其中V表示 ...
随机推荐
- kali linux宿主机和虚拟机互访实现方案
1.攻防模拟中,将DVWA安装到自己的宿主机中,在kali Linux中通过sqlmap和其他工具启动嗅探攻击,需要配置网络.虚拟机采用桥接方式,并复制Mac地址状况. 2.查看各自系统下的IP地址. ...
- 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器
置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...
- C++ Primer 笔记——枚举类型
1.和类一样,每个枚举类型定义了一种新的类型.枚举属于字面值常量类型. 2.C++包含两种枚举:限定作用域的和不限定作用域的.C++11新标准引入了限定作用域的枚举类型. }; // 限定作用域的枚举 ...
- StackService.Redis 应用
如今StackService.Redis已经转向商业版本.4.0以下的低版本依然免费和开源. 吴双,Redis系列命令拾遗分享 http://www.cnblogs.com/tdws/tag/NoSq ...
- Android Https双向认证 + GRPC
keywords:android https 双向认证android GRPC https 双向认证 ManagedChannel channel = OkHttpChannelBuilder.for ...
- U32592 摘果实
链接:https://www.luogu.org/problemnew/show/U32592 题解: 60-70分 二分+网络流
- Python_python内置加密模块
数据加密: 对称加密:数据加密和解密使用相同的密钥,主要解决数据的机密性(DES,AES) 非对称加密(公匙加密):数据加密和解密使用的不同密钥,主要用于身份的验证(DSA,RSA) 单向加密:只能加 ...
- flink的Standalone集群安装
1:上传安装包到linux系统 使用rz命令 2:解压 tar –zxvf flink-1.5.0-bin-hadoop24-scala_2.11.tgz 3:修改配置文件 vim conf/flin ...
- ELK 环境搭建1-Elasticsearch
一.安装前准备 1.节点 192.168.30.41 192.168.30.42 192.168.30.43 2.操作系统: Centos7.5 3.安装包 a.java8: jdk-8u181-li ...
- Docker 二进制安装docker
https://blog.csdn.net/bruce_yds/article/details/80035714