挑战性题目DSCT401:全源最短路径Floyd算法的并行实现
挑战性题目DSCT401:全源最短路径Floyd算法的并行实现
问题描述
n个顶点的有向图采用邻接矩阵进行储存,dist
和path
分别表示邻接矩阵和路径矩阵,初始化过程伪代码在下方给出。任意输入一个顶点规模正整数n,正确实现Floyd算法的基础上返回算法运行时间。
初始化过程: dist[i*n+j]=rand()%100
,若i==j
则dist[i*n+j]=0
。
题解
初始化数据部分,复杂度O(n2)O(n^2)O(n2),因为初始化各数据的过程独立,故可以通过并行来加快初始化过程。但由于该部分并非制约整个程序运行速度的主要因素,因此优化效果有限。
最短路求解部分,Floyd算法的第一层循环会枚举中间转移节点kkk,第二层和第三层循环枚举起点iii与终点jjj,通过方程path[i][j]=max(path[i][j],path[i][k]+path[k][j])
进行状态转移。其中,枚举起点终点的循环可以通过并发加速,因为他们并不依赖彼此的运算结果,只是基于上一层kkk循环的结果来进行转移。与之相反,最外层的kkk循环不能通过并行实现,因为每一次循环都会尝试以第kkk个节点为中介点更新最短路,因此对于每一对path[i][j]
,都需要经过所有节点的更新,其结果才是正确的。但倘若通过并行实现,每个CPU执行的程序段同时进行,每次更新时信息是“不完整”的,导致结果出错。
所以,在第二层循环语句前加上#pragma omp parallel for
从而启用并行运算,可以在保证算法正确性的同时降低时间消耗。虽然算法时间复杂度仍为O(n3)O(n^3)O(n3),但除以了一个常数C=CPU核心数。
需要注意的是,评测机并不包含直接编译时omp运行需要的dll文件,因此我们需要将其编译为静态库,即使用以下编译命令:
g++ -fopenmp -static xxx.cpp -o xxx.exe
代码
这种唯一的输出是自己的运行时间的**题还是头一回见……
#pragma GCC optimize(2)
#include<cstdio>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int M=1e3+5;
int n,dist[M][M],start;
int main(int argc,char* argv[])
{start=clock();srand(19260817);n=atoi(argv[1]);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)dist[i][j]=i==j?0:rand()%100;for(int k=1;k<=n;++k)#pragma omp parallel forfor(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(dist[i][j]>dist[i][k]+dist[j][k])dist[i][j]=dist[i][k]+dist[k][j];printf("%d\n",clock()-start);
// for(int i=1;i<=n;++i,putchar(10))
// for(int j=1;j<=n;++j)printf("%d ",dist[i][j]);return 0;
}
挑战性题目DSCT401:全源最短路径Floyd算法的并行实现相关推荐
- 多源最短路径--Floyd算法
#include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; int ...
- 图论-全源最短路径-对比Floyd算法与暴力Dijkstra算法
题目 输入顶点数N,有向边数M,接下来M行输入格式为u,v,w分别代表两个顶点u,v和两点之间边的权值w.输出全源最短路径 输入样例: 6 8 0 1 1 0 3 4 0 4 4 1 3 2 2 5 ...
- 动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法
参考图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA ) 这种算法也叫Floyd-Warshell算法,虽然和Warshell算法名字相近,算法思想也 ...
- Johnson 全源最短路径算法 Java实现
Johnson 全源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 End 算法导入 在之前的文章中,我们讲述了: 经典入门的Dijkstra算 ...
- Johnson全源最短路算法
我们最熟悉的全源最短路算法那肯定是Floyd. 不过Floyd的复杂度是O(n3)O(n^3)O(n3),显然难以接受. 当图比较稀疏的时候,即点数n和边数m同阶时,Johnson算法便有了用武之地. ...
- 分支限界法:单源最短路径--dijkstra算法
单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...
- C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)
基本思想是: 假设求从顶点vi到vj的最短路径. 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探. 首先考虑路径(vi, v0, ...
- c语言单元最短路径贪心算法,单源最短路径 贪心算法
<单源最短路径 贪心算法>由会员分享,可在线阅读,更多相关<单源最短路径 贪心算法(3页珍藏版)>请在人人文库网上搜索. 1.实验三 单源最短路径一.实验目的及要求掌握贪心算法 ...
- 全源最短路径之弗洛伊德算法(C语言)
Floyd(弗洛伊德)算法 该算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包. 时间复杂度为 O(N^3) 空 ...
- 求最短路径Floyd算法的并行化(解APSP问题)
求最短路径的串行算法在互联网上应该一搜一大堆,也非常简单,几行代码搞定.但Floyd的并行算法却很难搜到,github倒是有一些,但不容易运行成功,这里对这个算法的并行化进行详细的讲解,结合论文以及实 ...
最新文章
- MyBatis中的selectKey
- python调用外部程序 退出_Python调用(运行)外部程序
- ttl接地是高电平还是低电平_功放技术参数1——高电平
- HDFS体系架构介绍
- X86汇编语言从实模式到保护模式10:进入保护模式
- c# 判断是否存在次盘符_C# 怎么自动识别U盘盘符 进行判断 读写操作
- springMVC对简单对象、Set、List、Map的数据绑定和常见问题(三)
- MySQL书籍和资料
- 网件rax40可以刷梅林_深度爆料网件RAX40评价如何?怎么样呢?真实体验曝光
- SAP License:ML-物料分类账的未分配差异明细
- 三相并网逆变器PI控制——离网模式
- 爱心打印函数(基于EasyX图形库)
- csv to dbf java_CSV to DBF
- 【教程】Unity账号注册和Unity Hub激活
- 如何获取最新的EI期刊杂志目录
- Greasemonkey基础
- 农行k宝输入密码黑屏解决方法
- Simbec-Orion Group采用甲骨文电子临床云套件简化临床试验管理过程
- 自娱自乐的FreeRTOS ——简介
- 365天挑战LeetCode1000题——Day 079 力扣周赛专题 米哈游 检查相同字母间的距离 恰好移动 k 步到达某一位置的方法数目 最长优雅子数组