挑战性题目DSCT401:全源最短路径Floyd算法的并行实现

问题描述

n个顶点的有向图采用邻接矩阵进行储存,distpath分别表示邻接矩阵和路径矩阵,初始化过程伪代码在下方给出。任意输入一个顶点规模正整数n,正确实现Floyd算法的基础上返回算法运行时间。

初始化过程: dist[i*n+j]=rand()%100,若i==jdist[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算法的并行实现相关推荐

  1. 多源最短路径--Floyd算法

    #include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; int ...

  2. 图论-全源最短路径-对比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 ...

  3. 动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法

    参考图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA ) 这种算法也叫Floyd-Warshell算法,虽然和Warshell算法名字相近,算法思想也 ...

  4. Johnson 全源最短路径算法 Java实现

    Johnson 全源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 End 算法导入 在之前的文章中,我们讲述了: 经典入门的Dijkstra算 ...

  5. Johnson全源最短路算法

    我们最熟悉的全源最短路算法那肯定是Floyd. 不过Floyd的复杂度是O(n3)O(n^3)O(n3),显然难以接受. 当图比较稀疏的时候,即点数n和边数m同阶时,Johnson算法便有了用武之地. ...

  6. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  7. C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

    基本思想是: 假设求从顶点vi到vj的最短路径. 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探. 首先考虑路径(vi, v0, ...

  8. c语言单元最短路径贪心算法,单源最短路径 贪心算法

    <单源最短路径 贪心算法>由会员分享,可在线阅读,更多相关<单源最短路径 贪心算法(3页珍藏版)>请在人人文库网上搜索. 1.实验三 单源最短路径一.实验目的及要求掌握贪心算法 ...

  9. 全源最短路径之弗洛伊德算法(C语言)

    Floyd(弗洛伊德)算法 该算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包. 时间复杂度为 O(N^3) 空 ...

  10. 求最短路径Floyd算法的并行化(解APSP问题)

    求最短路径的串行算法在互联网上应该一搜一大堆,也非常简单,几行代码搞定.但Floyd的并行算法却很难搜到,github倒是有一些,但不容易运行成功,这里对这个算法的并行化进行详细的讲解,结合论文以及实 ...

最新文章

  1. MyBatis中的selectKey
  2. python调用外部程序 退出_Python调用(运行)外部程序
  3. ttl接地是高电平还是低电平_功放技术参数1——高电平
  4. HDFS体系架构介绍
  5. X86汇编语言从实模式到保护模式10:进入保护模式
  6. c# 判断是否存在次盘符_C# 怎么自动识别U盘盘符 进行判断 读写操作
  7. springMVC对简单对象、Set、List、Map的数据绑定和常见问题(三)
  8. MySQL书籍和资料
  9. 网件rax40可以刷梅林_深度爆料网件RAX40评价如何?怎么样呢?真实体验曝光
  10. SAP License:ML-物料分类账的未分配差异明细
  11. 三相并网逆变器PI控制——离网模式
  12. 爱心打印函数(基于EasyX图形库)
  13. csv to dbf java_CSV to DBF
  14. 【教程】Unity账号注册和Unity Hub激活
  15. 如何获取最新的EI期刊杂志目录
  16. Greasemonkey基础
  17. 农行k宝输入密码黑屏解决方法
  18. Simbec-Orion Group采用甲骨文电子临床云套件简化临床试验管理过程
  19. 自娱自乐的FreeRTOS ——简介
  20. 365天挑战LeetCode1000题——Day 079 力扣周赛专题 米哈游 检查相同字母间的距离 恰好移动 k 步到达某一位置的方法数目 最长优雅子数组

热门文章

  1. 使用EDD枚举域数据
  2. 数据库的主键Id不是从1开始的
  3. Panabit安装snmp插件
  4. ref:LDAP入门
  5. C#匿名委托,匿名函数,lambda表达式
  6. 编译cwm-recovery(含部分修改步骤)[转]
  7. Eclipse SQL Explorer
  8. 想成功创业,你首先要有这样的思维
  9. Treo 650使用专题及开发计划等
  10. python改错题重要的事情说三遍_5个很好的Python面试题问题答案及分析