学习了一个新的最小生成树的算法,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算法求最小生成树的更多相关文章

  1. HDU-1233 还是畅通工程 (prim 算法求最小生成树)

    prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. 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 思路:在保证不产生回 ...

  3. 利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构

    题目:聪明的猴子 链接:https://ac.nowcoder.com/acm/problem/19964 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个 ...

  4. prime算法求最小生成树(畅通工程再续)

    连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...

  5. 克鲁斯卡尔(Kruskal)算法求最小生成树

    /* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...

  6. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

  7. Prime算法 与 Kruskal算法求最小生成树模板

    算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...

  8. 859. Kruskal算法求最小生成树(模板)

    给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给定一张边带权的无向图G=(V, E),其中V表示 ...

  9. 858. Prim算法求最小生成树(模板)

    给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给定一张边带权的无向图G=(V, E),其中V表示 ...

随机推荐

  1. python网络爬虫笔记(九)

    4.1.1 urllib2 和urllib是两个不一样的模块 urllib2最简单的就是使用urllie2.urlopen函数使用如下 urllib2.urlopen(url[,data[,timeo ...

  2. day4-list,列表

    dist: 增:1.append(obj),在列表最后添加元素: 2.insert(index,object),在索引处添加元素: 3.extend,迭代添加元素,所添加元素必须可迭代. 删:1.po ...

  3. eclipse的安装及使用

    1.安装 2工作区 3透视图添加透视图 关闭和显示各个子视图 点击视图右上角的关闭按钮可以关闭当前视图 可以选择Window-->Show View菜单项打开各个子视图 4创建项目 选择File ...

  4. Oracle logminer 日志挖掘

    Table of Contents 1. LOGMNR简介 2. 创建数据字典 2.1. 外部文件存储数据字典 2.2. redo log 存储数据字典 3. 添加需要分析的文件 4. 开始分析文件 ...

  5. exec函数族

    进程程序替换 进程程序替换原理 fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任 ...

  6. DDD实践:领域事件

    要求:修改good表,添加 organization 基础定义 用于引发和调度事件的延迟方法 AddDomainEvent Domain\SeedWork\Entity.cs public abstr ...

  7. jquery中关于对象类型的判断原理

    class2type[ core_toString.call(obj) ] jquery中关于对象类型的判断原理 jquery源码中关于类型判断的工具函数为type,调用方法为$.type()或者jQ ...

  8. 如何区分oracle服务器、oracle客户端、plsql?

    大家在安装oracle数据库的时候,是不是有很多区分不清的概念,以至于束手无策呢?现在有一个问题,就是怎么区分oracle服务器.oracle客户端.plsql三者的概念?我想,新手在安装的时候可能会 ...

  9. bzoj 松鼠的新家

    哈夫曼距离与切比雪夫距离的转化

  10. python之GIL官方文档 global interpreter lock 全局解释器锁

    0.目录 2. 术语 global interpreter lock 全局解释器锁3. C-API 还有更多没有仔细看4. 定期切换线程5. wiki.python6. python.doc FAQ ...