P3366 【模板】最小生成树(boruvka/sollin)
boruvka/sollin
复杂度$O(mlogn)$
简要说明一下过程
引入一个数组$link[i]$表示连通块$i$下一步可更新的最短的边的编号
1.每次枚举所有边,如果边连接的2个点$(u,v)$不属于同连通块,那么更新$link[find(u)],link[find(v)]$(find(u)表示$u$所属的连通块)
2.枚举所有连通块,将$link[i]$两边的连通块合并。
3.如果第2步中有合并操作,则跳到1
注意更新$link[i]$,当比较的两条边权值相同时,要有确定的大小顺序,通常优先取编号小的。
#include<cstdio>
#include<cstring>
#define N 5005
#define M 200005
int n,m,k,ans,fa[N],link[N],U[M],V[M],W[M]; bool vis[M];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline bool fc(int x,int y){return W[x]==W[y]?x<y:W[x]<W[y];}
void boruvka(){
for(bool ok=;ok;){
memset(link,,sizeof(link)); ok=;
for(int i=;i<=m;++i) if(!vis[i]){
int r1=find(U[i]),r2=find(V[i]);
if(r1==r2) continue;
if(fc(i,link[r1])) link[r1]=i;
if(fc(i,link[r2])) link[r2]=i;
}
for(int i=;i<=n;++i) if(!vis[link[i]]&&link[i]){
vis[link[i]]=ok=; ans+=W[link[i]]; ++k;
fa[find(U[link[i]])]=find(V[link[i]]);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) fa[i]=i;
for(int i=;i<=m;++i) scanf("%d%d%d",&U[i],&V[i],&W[i]);
W[]=1e9; boruvka();
k==n- ? printf("%d",ans):puts("orz");
return ;
}
P3366 【模板】最小生成树(boruvka/sollin)的更多相关文章
- [洛谷P3366] [模板] 最小生成树
存个模板,顺便复习一下kruskal和prim. 题目传送门 kruskal 稀疏图上表现更优. 设点数为n,边数为m. 复杂度:O(mlogm). 先对所有边按照边权排序,初始化并查集的信息. 然后 ...
- P3366 (模板)最小生成树
2019-01-30 最小生成树基本算法 定义: 给定一个边带权的无向图G=(V,E),n=|V|,m=|E|,由V中全部n个定点和E中n-1条边构成的无向连通子图被称为G的一颗生成树. 边的权值之和 ...
- 洛谷P3366 【模板】最小生成树(Boruvka算法)
题意 题目链接 Sol 自己yy着写了一下Boruvka算法. 算法思想很简单,就是每次贪心的用两个联通块之间最小的边去合并. 复杂度\(O(n \log n)\),然鹅没有Kruskal跑的快,但是 ...
- 【洛谷 p3366】模板-最小生成树(图论)
题目:给出一个无向图,求出最小生成树,如果该图不连通,则输出orz. 解法:Kruskal求MST. 1 #include<cstdio> 2 #include<cstdlib> ...
- luoguP3366 [模板] 最小生成树
题目链接:https://www.luogu.org/problemnew/show/P3366 思路: 求最小生成树的模板题,求MST有两种算法——Prim.Kruskal. 两者区别:Prim在稠 ...
- 模板<最小生成树>
转载 最小生成树浅谈 这里介绍最小生成树的两种方法:Prim和Kruskal. 两者区别:Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣.Prim是以更新过的节点的连边找最小值,K ...
- 模板——最小生成树prim算法&&向前星理解
通过最小生成树(prim)和最短路径优化引出的向前星存图,时至今日才彻底明白了.. head[i]存储的是父节点为i引出的最后一条边的编号, next负责把head[i]也就是i作为父节点的所有边连接 ...
- 模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...
- P3366 【模板】最小生成树
原题链接 https://www.luogu.org/problemnew/show/P3366 一道最小生成树的模板题...... 昨天刚学最小生成树,wz大佬讲的一塌糊涂井然有序,所以我们今天做起 ...
随机推荐
- 2019.04.09 电商24 订单模快 ORM
前面三个模块已近结束,现在看是订单模块的.想一下淘宝上的订单,在购物车中选中,提交,跳转到订单界面. 获取传过来的信息,那也要建立一个订单表,当我支付的时候,也要获取一些数据,将这些数据放到这个表中 ...
- python list seq
//test.py list1 = [1, 2, 3]list2 = [4, 5, 6] print cmp(list1, list2)print len(list1), len(list2)prin ...
- cocos2d JS 使用代码判断对象类型
changeAtlasScoreString : function (score,tfScore) { if(tfScore.getDescription() == "LabelAtlas& ...
- matlab 字符串处理函数
https://www.cnblogs.com/emanlee/archive/2012/09/13/2683912.html % 字符串处理 a=' a';b='b b';c='cccc';m= ...
- ES6之字符串扩展
ES6字符串新增的常用方法: 1. includes(): 字符串中是否包含某个字符或字符串, 包含的两个字符必须是相连的 let str = 'hello, world' str.includes( ...
- 代码审查Code Review
代码审查清单 常规项 代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. 所有的代码是否简单易懂? 代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注 ...
- MyEclipse10中文乱码
1 进入window->preferences general->content types,可以设置Text对应的default encoding值为UTF-8或为空,然后点击updat ...
- STL之Map和multimap容器
1.Map和multimap容器 1)map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. 2)map中key值是唯一的.集合中的元素按一 ...
- XMLHttpRequest对象(Ajax)的状态码(readystate) HTTP状态代码(status)
2018-11-28 14:19:00 来自 :XMLHttpRequest对象(Ajax)的状态码(readystate) HTTP状态代码(status) XMLHttpRequest对象(Aj ...
- arc 093 D – Grid Components
题意: 给出A和B,要求构造出一个具有A个白色连通块和B个黑色连通块的矩阵. 这个矩阵的长和宽最多为100. 思路: 试想如果横着每个点同类的点隔着一个不同的点,竖着每个同类的点隔着一个不同的点,那么 ...