做了个对比.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相关推荐

  1. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)

    题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...

  2. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  3. ICPC-图论知识与算法要览

    1.图定义(Definitions in graph theory) 1)图(Graph) 2)有向图(Directed graph) 3)图数据表示 邻接矩阵(Adjacency Matrix),邻 ...

  4. 《Boost》Part1 Minimum Spanning Tree

    <Boost>Part1 Minimum Spanning Tree 1.Boost中的最小生成树介绍 MST最小生成树,是图论中的基本算法,还有一种是最大生成树,此处暂不介绍. 最小生成 ...

  5. 和小公主一起学习Branch and Bound

    如有侵权请私信联系. 在运筹学的整数规划部分我们学过简单的分支定界,对于复杂的组合优化问题,怎么搜索,剪枝,定界呢? TSP问题 对于TSP,我们需要利用上界和下界来进行剪枝,通过不断更新上界和下界, ...

  6. 连通域最小外接矩形算法原理_算法|图论 2W字知识点整理(超全面)

    作者:SovietPower✨ 链接:https://ac.nowcoder.com/discuss/186584 来源:牛客网 度数序列 对于无向图, 为每个点的度数.有 (每条边被计算两次).有偶 ...

  7. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  8. 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

    #include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...

  9. Kruskal算法 - C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  10. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

最新文章

  1. php发光字体代码,CSS3怎么实现字体发光效果
  2. Python入门:常用模块—logging模块
  3. Windows 系统补丁管理策略
  4. bash awk_Bash指南,Linux终端技巧,DevOps错误,Python,awk,NASA等
  5. python retry retrying使用
  6. 小灰的算法之旅python篇pdf_漫画算法 小灰的算法之旅 Python篇
  7. 国科大学习资料--操作系统(杨力祥)--2015年思考题(含解答)
  8. 关于存储pose时.dat类型的文件里面的type问题(细节)
  9. 如何下载飞思卡尔单片机的S19文件
  10. 开场PPT动画怎么做炫酷
  11. 试简述smtp通信的三个阶段的过程_POP3_SMTP_IMAP初步介绍
  12. 【细胞分割】基于中值滤波+分水岭法实现细胞计数matlab源码
  13. 带你走进Choerodon猪齿鱼的知识管理
  14. 奥城大学计算机科学专业,我是学工程专业本科毕业,托福70分,GRE1020分,都很低,我想去美国留学马上走,...
  15. 〖Python WEB 自动化测试实战篇⑤〗- selenium 元素定位详解 - (八大元素定位方式)
  16. vscode怎么运行android项目,windows + flutter +android+ vscode 安装配置运行流程(详细版本)...
  17. JS 对输入的姓名 手机号码 邮箱做校验
  18. 英语四六级作文句型收集
  19. 美国网红python微博_利用Python对微博网红进行对比
  20. 光纤(Fiber Optics)结构与种类

热门文章

  1. svn 重新定位版本库
  2. LCS (动态规划)
  3. 用UCWEB浏览器上网 省流量小技巧
  4. SitePoint播客#26:力量在于您
  5. NYOJ 小明的存钱计划
  6. 从数据流角度管窥 Moya 的实现(二):处理响应
  7. 如何禁用Citrix Receiver硬件加速功能
  8. 5行java关键代码实现excel转pdf代码实战教程
  9. Java工具类实现excel转pdf结果几乎一模一样
  10. swagger 怎么去掉get delete_橡皮擦英文单词怎么读