Problem D: 算法7-16:弗洛伊德最短路径算法

Time Limit: 1 Sec  Memory Limit: 32 MB
Submit: 22  Solved: 14
[Submit][Status][Web Board]

Description

在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题。

解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O(n3)。

而另一种算法是由弗洛伊德提出的,时间复杂度同样是O(n3),但算法的形式简单很多。

可以将弗洛伊德算法描述如下:

在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出每一对顶点间的最短路径长度。

Input

输入的第一行包含1个正整数n,表示图中共有n个顶点。其中n不超过50。

以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。

Output

共有n行,每行有n个整数,表示源点至每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。对于某个顶点到其本身的最短路径长度,输出0。

请在每个整数后输出一个空格,并请注意行尾输出换行。

Sample Input

4
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

Sample Output

0 3 2 1
6 0 4 7
2 5 0 3
3 6 1 0

HINT

在本题中,需要按照题目描述中的算法完成弗洛伊德算法,并在计算最短路径的过程中将每个顶点是否可达记录下来,直到求出每一对顶点的最短路径之后,算法才能够结束。

相对于迪杰斯特拉算法,弗洛伊德算法的形式更为简单。通过一个三重循环,弗洛伊德算法可以方便的求出每一对顶点间的最短距离。

另外需要注意的是,为了更方便的表示顶点间的不可达状态,可以使用一个十分大的值作为标记。而在题目描述中的算法示例使用了另外一个三维数组对其进行表示,这使原本的O(n3)时间复杂度增长到了O(n4),这也是需要自行修改的部分。

#include <iostream>
using namespace std;
int d[55][55];
int n;
void floyd()
{int i,j,k;for(i=0; i<n; i++)d[i][i]=0;for(k=0; k<n; k++)for(i=0; i<n; i++)for(j=0; j<n; j++){if(d[i][j]>d[i][k]+d[k][j]&&d[i][k]!=99999999&&d[k][j]!=999999999)d[i][j]=d[i][k]+d[k][j];}
}
int main()
{int s;cin>>n>>s;int i,j;for(i=0; i<n; i++){for(j=0; j<n; j++){cin>>d[i][j];if(i!=j&&d[i][j]==0) d[i][j]=99999999;}}floyd();for(j=0; j<n; j++){if(j!=s){if(d[s][j]!=99999999)cout<<d[s][j]<<" ";elsecout<<"-1 ";}}cout<<endl;return 0;
}

算法7-16:弗洛伊德最短路径算法相关推荐

  1. Codeup 问题 B: 算法7-16:弗洛伊德最短路径算法

    题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O( ...

  2. Codeup墓地-问题 B: 算法7-16:弗洛伊德最短路径算法

    题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O( ...

  3. 题目 1709: 数据结构-Floyd(弗洛伊德)最短路径算法

    参考<大话数据结构-弗洛伊德算法> 题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求 ...

  4. Dijkstra算法以及与其他最短路径算法简要对比

    算法步骤如下:贪心思想 这里默认1为起点,且每一轮必定找出一个其他点到1点的最短路径,那么将在n-1轮后找到所有点到1点的最短路径. 找出与 1 直接相邻的点,在这些邻点与 1 组成的边中选择权值最小 ...

  5. 【老生谈算法】matlab实现最短路径算法——最短路径算法

    最短路径算法-matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]最短路径算法-matlab程序.doc 2.算 ...

  6. 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

    Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...

  7. Dijkstra(迪杰斯特拉)算法:单源最短路径算法

    算法目的 以较小的时间复杂度求解加权有向图中一个源点到其余各个点的最短路径. 适用条件 图中不存在负权边.(否则,原点到原点的距离为0却不是最近的,显然违背了逻辑) 算法原理 将加权有向图中的点分为S ...

  8. dijkstra算法_Dijkstra算法详细(单源最短路径算法)

    介绍 对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原 ...

  9. dijkstra最短路径算法视频_Dijkstra算法详细(单源最短路径算法)

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  10. 【老生谈算法】matlab实现最短路径算法源码——最短路径算法

    每对顶点之间的最短路径 matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]最短路径的Floyd算法的Matla ...

最新文章

  1. HBase学习之路 (九)HBase phoenix的使用
  2. 12款经典图片轮播jquery插件
  3. 数字图像处理:第九章 线性系统、卷积、傅立叶变换
  4. 两篇很牛的vim使用技巧
  5. Python 爬虫面试题 102 道
  6. 线程的退出 java_(转)Java结束线程的三种方法
  7. composer查看当前镜像取消_Docker image镜像常用命令
  8. nuSVC的使用和解读
  9. 哈夫曼树 (最优二叉树)
  10. python能做什么程序-学完python可以做什么?
  11. 求两条直线(线段)的交点
  12. WPF和Winform中picturebox图片局部放大
  13. NVIDIA英伟达旧版本显卡下载
  14. 【5G NR】工作频段和信道安排
  15. 计算机主机上有几个按钮,键盘按键有什么功能 电脑键盘上各个按键功能详解...
  16. pytorch训练Class-Balanced Loss
  17. tf.executing_eagerly()
  18. 微服务设计 10 大反模式和陷阱
  19. android电视横竖屏切换在哪里,Android横竖屏切换总结
  20. (传统安装--生信软件)——FastQC 下载安装

热门文章

  1. 安徽 计算机能力提升,休宁教师“充电”提升信息技术应用能力
  2. ElasticSearch全文搜索引擎之Restful API和索引操作篇
  3. java技术体系基础
  4. 老男孩教育每日一题-第95天-shell脚本知识点:书写脚本完成ftp上传下载
  5. 开通博客,记录一下。
  6. [转载] 七龙珠第一部——第012话 向神龙许愿
  7. 【笔记】gradle命令行运行任务如何设置代理模式
  8. Android NDK开发如何解决logcat日志打印不全
  9. mysql损坏打不开_mac系统上 MySQL Workbench意外退出,再也打不开
  10. 修改element ui的table的某一列的样式