大概是这样的:一开始图中有\(n\)个连通块,每次操作我们选出各个连通块连出去的最短的边(如果有相同边权的边的话可以把序号作为第二关键字),然后把这些边加入最小生成树。

最坏的情况下每次操作都会让当前的连通块减半,因此Boruvka算法的复杂度为\(O(m\log n)\)。

主要的应用在于边数为\(O(n^2)\)级别但是有特殊性质(如曼哈顿距离、异或等)的情况,选各个连通块连出去的边的时候可以不枚举每条边而是直接找。

#include<bits/stdc++.h>
const int N=5007,M=200007;
struct edge{int u,v,w;}e[M];
int vis[M],a[N],fa[N];
int read(){int x;scanf("%d",&x);return x;}
int cmp(int i,int j){return !j? 1:(e[i].w<e[j].w||(e[i].w==e[j].w&&i<j));}
int Find(int x){return x==fa[x]? x:fa[x]=Find(fa[x]);}
int main()
{
int n=read(),m=read(),i,cnt=1,sum=0,f=1,u,v;
for(i=1;i<=m;++i) e[i]=(edge){read(),read(),read()};
for(i=1;i<=n;++i) fa[i]=i;
while(f)
{
f=0,memset(a,0,sizeof a);
for(i=1;i<=m;++i)
{
if(vis[i]||(u=Find(e[i].u))==(v=Find(e[i].v))) continue;
if(cmp(i,a[u])) a[u]=i;
if(cmp(i,a[v])) a[v]=i;
}
for(i=1;i<=n;++i)
if(a[i]&&!vis[a[i]])
f=1,++cnt,sum+=e[a[i]].w,vis[a[i]]=1,fa[Find(e[a[i]].u)]=Find(e[a[i]].v);
}
cnt==n? printf("%d",sum):puts("orz");
}

Boruvka的更多相关文章

  1. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  2. 洛谷P3366 【模板】最小生成树(Boruvka算法)

    题意 题目链接 Sol 自己yy着写了一下Boruvka算法. 算法思想很简单,就是每次贪心的用两个联通块之间最小的边去合并. 复杂度\(O(n \log n)\),然鹅没有Kruskal跑的快,但是 ...

  3. Boruvka算法求最小生成树

    学习了一个新的最小生成树的算法,Boruvka(虽然我不知道怎么读).算法思想也是贪心,类似于Kruskal. 大致是这样的,我们维护图中所有连通块,然后遍历所有的点和边,找到每一个连通块和其他连通块 ...

  4. P3366 【模板】最小生成树(boruvka/sollin)

    P3366 [模板]最小生成树 boruvka/sollin 复杂度$O(mlogn)$ 简要说明一下过程 引入一个数组$link[i]$表示连通块$i$下一步可更新的最短的边的编号 1.每次枚举所有 ...

  5. cf888G. Xor-MST(Boruvka最小生成树 Trie树)

    题意 题目链接 给出\(n\)点,每个点有一个点权\(a[i]\),相邻两点之间的边权为\(a[i] \oplus a[j]\),求最小生成树的值 Sol 非常interesting的一道题,我做过两 ...

  6. boruvka算法

    算法正确性证明: 1.最优性:最小边一定包含在生成树中. 2.合法性:一定不会构成环.如果存在环说明一个点的最小连边有两个,显然矛盾. 算法时间复杂度证明: 每执行一次算法,所有联通块的大小都至少为2 ...

  7. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  8. HDU1102--最小生成树

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. Kruskal vs Borůvka

    做了个对比.Borůvka算法对于稠密图效果特别好.这两个都是求生成森林的算法.Prim+heap+tarjan过于难写不写了. V=200,E=1000 Kruskal method 4875048 ...

随机推荐

  1. BZOJ 2434: [Noi2011]阿狸的打字机 AC自动机+fail树+线段树

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  2. TTTTTTTTTTTTTTTTT POJ 2226 草地覆木板 二分匹配 建图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9754   Accepted: 3618 Desc ...

  3. Pod初始化容器之Init Container

    Init 容器的介绍 Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init容器Init 容器与普通的容器非常像,除了如下两点:  c Init 容器总是运行 ...

  4. 使用svn在github上下载文件夹

    今天想在github上下载mybatis-generator的eclipse插件,可是如何在github上下载一个文件夹而不用把这个项目clone呢,搜了一下,发现可以直接用svn来下载 只需将将路径 ...

  5. C++入门经典-例2.15-逗号表达式的应用

    1:代码如下: // 2.15.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<iostream> using na ...

  6. Python学习笔记:外部数据的输入、存储等操作

    查看current工作路径: >>> import os >>> os.getcwd() 'D:\\python' 更改工作路径: >>> os. ...

  7. flutter runtimeType

    通过runtimeType可以获取当前数据类型 var a = 10; var b = 10.0; var c = '10'; var d = true; var e = [12.5,13.1]; v ...

  8. Appium+python自动化-输入中文

    一.定位搜索 1.打开淘宝点击搜索按钮,进入到搜索页面 2.然后定位到搜索框后用sendkeys方法输入‘hao’,这里定位元素使用uiautomatorviewer工具即可 3.脚本如下,输入的是英 ...

  9. 阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制

    创建新项目 复制上一个pom.xml的内容.依赖和打包的方式 再复制src的代码过来 bean.xml.多导入context的声明 Service的实现类增加注解 dao的set方法删掉 通过Auto ...

  10. vue v-for直接循环数字

    <svg class="icon" aria-hidden="true" v-for="index of 5" :key=" ...