Kruskal vs Borůvka
做了个对比.Borůvka算法对于稠密图效果特别好.这两个都是求生成森林的算法.Prim+heap+tarjan过于难写不写了.
V=200,E=1000 Kruskal method 487504811 Time usage: 129 us Bor(uc)uvka method 487504811 Time usage: 94 us V=500,E=3000 Kruskal method 1068863143 Time usage: 431 us Bor(uc)uvka method 1068863143 Time usage: 321 us V=1000,E=10000 Kruskal method 1248132507 Time usage: 1626 us Bor(uc)uvka method 1248132507 Time usage: 707 us V=2000,E=50000 Kruskal method 1023451601 Time usage: 4444 us Bor(uc)uvka method 1023451601 Time usage: 1781 us V=5000,E=100000 Kruskal method 3177798955 Time usage: 8300 us Bor(uc)uvka method 3177798955 Time usage: 3473 us V=10000,E=300000 Kruskal method 4240792222 Time usage: 26751 us Bor(uc)uvka method 4240792222 Time usage: 11332 us V=10000,E=500000 Kruskal method 2548867302 Time usage: 45754 us Bor(uc)uvka method 2548867302 Time usage: 18561 us V=20000,E=1000000 Kruskal method 5166175346 Time usage: 92360 us Bor(uc)uvka method 5166175346 Time usage: 38672 us V=50000,E=1000000 Kruskal method 32391070642 Time usage: 96633 us Bor(uc)uvka method 32391070642 Time usage: 54670 us V=100000,E=1000000 Kruskal method 129350661440 Time usage: 101094 us Bor(uc)uvka method 129350661440 Time usage: 79034 us V=300000,E=2000000 Kruskal method 578989469565 Time usage: 229092 us Bor(uc)uvka method 578989469565 Time usage: 208983 us V=500000,E=6000000 Kruskal method 536707083899 Time usage: 689042 us Bor(uc)uvka method 536707083899 Time usage: 654468 us V=1000000,E=10000000 Kruskal method 1290266237257 Time usage: 1254349 us Bor(uc)uvka method 1290266237257 Time usage: 1443208 us V=5000000,E=50000000 Kruskal method 6456472043049 Time usage: 8274752 us Bor(uc)uvka method 6456472043049 Time usage: 16565600 us V=10000000,E=50000000 Kruskal method 25804619307783 Time usage: 10263962 us Bor(uc)uvka method 25804619307783 Time usage: 18875336 us
这个Boruvka的写法不是最好的;但是链表动态删除的Boruvka会很长也就没有比较的意义了.
#define sizex 100000000
#include <cmath>
#include <cstdio>
#include <random>
#include <algorithm>
#include <malloc.h>
#include <sys/time.h>
using namespace std;
int *data,res;
long long mytic(){long long result = 0.0;struct timeval tv;gettimeofday( &tv, NULL );result = ((long long)tv.tv_sec)*1000000 + (long long)tv.tv_usec;return result;
}
#define dic1() disA(generator)
#define dic2() disB(generator)
struct edge{int a,b,w;};
bool cmp(edge a,edge b){return a.w<b.w;
}
#define foredge for(int i=0;i<gr.El;++i)
#define forvert2 for(int i=0;i<gr.N;++i)
#define eg gr.E[i]
struct graph{int N,El;edge E[50000000];void sorter(){sort(E,E+El,cmp);}void genData(int a,int b){N=a;El=b;mt19937 generator;uniform_int_distribution<int> disA(0,N-1);uniform_int_distribution<int> disB(0,21474836);for(int i=0;i<El;++i){E[i].a=dic1();while((E[i].b=dic1())==E[i].a);E[i].w=dic2();}}
} gr;
struct ds_set{int fa[10000000];void clear(){for(int i=0;i<gr.N;++i) fa[i]=-1;}int find(int p){return ~fa[p]?fa[p]=find(fa[p]):p;}inline int merge(int a,int b){return (a==b)?(-1):(fa[b]=a);}
} ds;
#define ffind(a) ds.find(a)
#define funion(a,b) ds.merge(a,b)
struct algo_Kruskal{long long run(){long long ans=0;gr.sorter();int a,b;foredge{a=ffind(eg.a),b=ffind(eg.b);ans+=~funion(a,b)?eg.w:0;}return ans;}
} Kruskal;
struct algo_Boruvka{struct v{int a,p;} vm[10000000];long long run(){long long ans=0;int a,b,c,w;while(1){c=0;forvert2 vm[i].a=100000000;foredge{w=eg.w,a=ffind(eg.a),b=ffind(eg.b);if(a==b) continue;++c;if(w<vm[a].a) vm[a]={w,i};if(w<vm[b].a) vm[b]={w,i};}if(!c) break;forvert2 if(vm[i].a!=100000000) {a=ffind(gr.E[vm[i].p].a);vm[i].p=ffind(gr.E[vm[i].p].b);ans+=(~funion(a,vm[i].p))?vm[i].a:0;}}return ans;}
} Boruvka;
FILE* loggar;
void testN(){long long i;printf("Kruskal method\n");fprintf(loggar,"Kruskal method\n");ds.clear();long long start=mytic();i=Kruskal.run();start=mytic()-start;printf("%lld\n",i);printf("Time usage: %lld us\n",start);fprintf(loggar,"%lld\n",i);fprintf(loggar,"Time usage: %lld us\n",start);
}
void testU(){long long i;printf("Bor(uc)uvka method\n");fprintf(loggar,"Bor(uc)uvka method\n");ds.clear();long long start=mytic();i=Boruvka.run();start=mytic()-start;printf("%lld\n",i);printf("Time usage: %lld us\n",start);fprintf(loggar,"%lld\n",i);fprintf(loggar,"Time usage: %lld us\n",start);
}
int as[15]={200 ,500 ,1000 ,2000 ,5000 ,10000 ,10000 ,20000 ,50000 ,100000 ,300000 ,500000 ,1000000 ,5000000 ,10000000};
int bs[15]={1000,3000,10000,50000,100000,300000,500000,1000000,1000000,1000000,2000000,6000000,10000000,50000000,50000000};
int main(){int a,b,c,i,j,k,l,m,n,N,U,P,UP;loggar=fopen("MSTTest.data","w");for(int i=0;i<15;++i){printf("%d %d\n",as[i],bs[i]);fprintf(loggar,"V=%d,E=%d\n",as[i],bs[i]);gr.genData(as[i],bs[i]);testN(),testU();}fclose(loggar);return 0;
}
过饱和稠密图上花样虐Kruskal
V=3000,E=50000000 Kruskal method 2305771 Time usage: 5808210 us Bor(uc)uvka method 2305771 Time usage: 1270494 us V=5000,E=50000000 Kruskal method 6381189 Time usage: 5789551 us Bor(uc)uvka method 6381189 Time usage: 1274763 us V=10000,E=50000000 Kruskal method 25291282 Time usage: 5834369 us Bor(uc)uvka method 25291282 Time usage: 1654772 us
稀疏图大概比Kruskal慢一倍,花样虐Prim.
还有一个小花絮就是我弄错随机数生成范围Kruskal狂错不止.
Prim+pbdsheap还是有前途的,不过Boruvka完全够了.
两个长度加起来和不带堆的Prim一样了真不错.
转载于:https://www.cnblogs.com/tmzbot/p/4603512.html
Kruskal vs Borůvka相关推荐
- Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)
题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...
- NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...
- ICPC-图论知识与算法要览
1.图定义(Definitions in graph theory) 1)图(Graph) 2)有向图(Directed graph) 3)图数据表示 邻接矩阵(Adjacency Matrix),邻 ...
- 《Boost》Part1 Minimum Spanning Tree
<Boost>Part1 Minimum Spanning Tree 1.Boost中的最小生成树介绍 MST最小生成树,是图论中的基本算法,还有一种是最大生成树,此处暂不介绍. 最小生成 ...
- 和小公主一起学习Branch and Bound
如有侵权请私信联系. 在运筹学的整数规划部分我们学过简单的分支定界,对于复杂的组合优化问题,怎么搜索,剪枝,定界呢? TSP问题 对于TSP,我们需要利用上界和下界来进行剪枝,通过不断更新上界和下界, ...
- 连通域最小外接矩形算法原理_算法|图论 2W字知识点整理(超全面)
作者:SovietPower✨ 链接:https://ac.nowcoder.com/discuss/186584 来源:牛客网 度数序列 对于无向图, 为每个点的度数.有 (每条边被计算两次).有偶 ...
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)
#include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...
- Kruskal算法 - C语言详解
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- vijos P1190繁忙的都市(Kruskal)(最小生成树)
P1190 繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...
最新文章
- php发光字体代码,CSS3怎么实现字体发光效果
- Python入门:常用模块—logging模块
- Windows 系统补丁管理策略
- bash awk_Bash指南,Linux终端技巧,DevOps错误,Python,awk,NASA等
- python retry retrying使用
- 小灰的算法之旅python篇pdf_漫画算法 小灰的算法之旅 Python篇
- 国科大学习资料--操作系统(杨力祥)--2015年思考题(含解答)
- 关于存储pose时.dat类型的文件里面的type问题(细节)
- 如何下载飞思卡尔单片机的S19文件
- 开场PPT动画怎么做炫酷
- 试简述smtp通信的三个阶段的过程_POP3_SMTP_IMAP初步介绍
- 【细胞分割】基于中值滤波+分水岭法实现细胞计数matlab源码
- 带你走进Choerodon猪齿鱼的知识管理
- 奥城大学计算机科学专业,我是学工程专业本科毕业,托福70分,GRE1020分,都很低,我想去美国留学马上走,...
- 〖Python WEB 自动化测试实战篇⑤〗- selenium 元素定位详解 - (八大元素定位方式)
- vscode怎么运行android项目,windows + flutter +android+ vscode 安装配置运行流程(详细版本)...
- JS 对输入的姓名 手机号码 邮箱做校验
- 英语四六级作文句型收集
- 美国网红python微博_利用Python对微博网红进行对比
- 光纤(Fiber Optics)结构与种类