Boruvka求最小生成树
因为牛客多校我第一次见到这个算法:算法大致过程就是因为牛客多校我第一次见到这个算法: 算法大致过程就是因为牛客多校我第一次见到这个算法:算法大致过程就是
对于每个连通块,每次找出一条最小的出边
然后把两个连通块合并
每次可以是连通块个数减半
然后就得到了一个O((n+m)log n)的做法
代码模板:
#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <limits.h>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
// #define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 4e5+10, mod = 1e9 + 9;
const long double eps = 1e-5;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
struct node {int to, next, w;
}e[N], mi[N];
int fa[N];
int head[N], cnt;
int n,m;
inline int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}inline void add(int from, int to, int w)
{e[cnt] = {to,head[from],w};head[from] = cnt ++;
}inline int Borucka()
{int ans = 0, edg = 0;while(1){ms(mi,INF);for(int i = 1; i <= n; ++ i)for(int j = head[i]; ~j; j = e[j].next){int v = e[j].to, w = e[j].w;if(find(v) != find(i) && w < mi[find(i)].w){mi[find(i)].w = w, mi[find(i)].to = v;}}int F = 0;for(int i = 1; i <= n; ++ i){int v = mi[i].to, w = mi[i].w;if(mi[i].to != mi[0].to && find(i) != find(v)) fa[find(v)] = find(i), ans += w, edg ++, F = 1;}if(!F) break;}if(edg == n - 1) return ans;else return -1;
}int main()
{read(n,m);ms(head,-1);for(int i = 0; i <= n + 1; ++ i) fa[i] = i;for(int i = 0; i < m; ++ i){int l, r, w;read(l,r,w);add(l,r,w);add(r,l,w);}int ans = Borucka();if(ans == -1) cout << "orz";else cout << ans << endl;
}
Boruvka求最小生成树相关推荐
- Prim算法和Kruskal算法求最小生成树
Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...
- CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树
题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...
- prim算法求最小生成树_克鲁斯卡尔算法(Kruskal算法)求最小生成树
上一节介绍了求最小生成树之普里姆算法.该算法从顶点的角度为出发点,时间复杂度为O(n2),更适合与解决边的绸密度更高的连通网.本节所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(e ...
- C语言Prims求最小生成树MST的算法(附完整源码)
C语言Prims求最小生成树MST的算法 C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测试) C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测 ...
- C语言实现克鲁斯卡尔Kruskal算法求最小生成树(附完整源码)
Kruskal算法求最小生成树 Edge结构体,Graph结构体 Kruskal算法求最小生成树完整源码(定义,实现,main函数测试) Edge结构体,Graph结构体 // a structure ...
- prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...
- HDU 1301 - Jungle Roads( Prim求最小生成树 )
题意 给出n个编号为A~A+n的节点,和某些节点之间的距离,求最小生成树的总权值 思路 裸的Prim算法求最小生成树 算法细节: 最小生成树-Prim算法和Kruskal算法 AC代码 #includ ...
- 离散实验一 油管铺设 (求最小生成树的Prim算法的实际应用)
实验一 油管铺设 2018.11.06于CSDN释放 详见GitHub: https://github.com/DolorHunter/PrimAlgorithm 实验准备 最小生成树问题,求最小生成 ...
- 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法
基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...
最新文章
- 软件版本具体代表什么意思
- cocos2dx游戏--欢欢英雄传说--添加游戏背景
- resnet50加入fpn_FPN+SSD同时兼顾速度和精度的检测器(二)
- 日志服务数据加工最佳实践: 从其他logstore拉取数据做富化
- python接口自动化(四十一)- 发xml格式参数的post请求(超详解)
- identifier is too long 异常处理
- 站点页面Service Unavailable 503的一种解决方法
- Python 路径问题--No such file or directory
- wacom数位板怎么调压感_手绘板压感是什么 数位板压感怎么调【教程】
- 201015.阅读和了解什么是形式化方法
- 【物联网设计记录】基于机智云云平台的Wi-Fi控制开发板
- windows10系统更新后,Windows.old 无法删除解决方法
- 跟着团子学SAP EPPM: CPM主要底表
- 大话设计模式 第二十三章 命令模式 考羊肉串
- NLP深入学习——什么是词向量和句向量(Word Embedding and Sentence Embedding)
- 给input[text]添加icon,并且绑定事件
- 192.168.8.1手机登陆_手机怎么登陆192.168.8.1设置路由器(2
- java-php-python-ssmX钢材商贸公司网络购销管理系统计算机毕业设计
- 我为什么选择超级IP名片
- difference用法