问题

求解任意两点间最短路问题也叫多源最短路径问题。

可解决途径

一种方法时把图中每个点当做源点重复算n次Dijkstra 算法(Dijkstra是求单源最短路径的算法),时间复杂度O(n^3),据说可以优化成O( n^2 * logn)。
另一种方法时最经典的算法Floyd算法,时间复杂度也是O(n^3),但是关键代码只有5行,适合时间要求不苛刻的时候编写。

Floyd算法基本思想

Floyd算法本质上是一个动态规划算法。对于每个顶点k,枚举其他两个顶点i和j,若i和j之间的距离大于i到k加上k到j的距离,那么更新i到j之间的距离。

【注】Floyd算法允许图中有带负权值的边,但不允许有包含带负权值的边组成的回路。(这句话摘自书上,本人并未深刻理解,若有大佬理解,望指教一二)

基本操作

d[k][i][j] 表示 顶点i 经过顶点k 到顶点j 的最短路径长度。

分两种情况讨论:

  1. 经过顶点k, d[k][i][j] = d[k-1][i][j]。 即等于只用前k-1个顶点时的最短路径

  2. 不经过顶点k, d[k][i][j] = d[k-1][i][k] + d[k-1][k][j]。 即等于i离k的最路路径+k离j的最短路径。

可以得到递推式 d[k][i][j] = min( d[k-1][i][j] , d[k-1][i][k] + d[k-1][s][k] );

还可优化

由于第k层只与k-1层相关,也可以用二维表示:
(图片)
(本图来自知乎,放在此处侵删)
d[i][j] = min( d[i][j] , d[i][k] + d[k][j] );

精简版算法模板:

#include <bits\stdc++.h>
using namespace std;
#define INF 2147483647
#define MAX_V 1000
#define MAX_E 2000 int d[MAX_V][MAX_V]; // d[u][v]表示边u->v的距离(不存在时设为INF,d[i][i] = 0)
int V;             //  顶点数
void warshall_floyd(){for(int k = 0;k < V; k++){for(int i = 0;i < V; i++){for(int j = 0;j < V; j++){if(i != j && i != k && j != k)if(d[i][k] != INF && d[k][j] != INF) //INF与正数相加会溢出d[i][j] = min(d[i][j], d[i][k] + d[k][j]);}}}
}
int main(){
}

【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)相关推荐

  1. 任意两点间的最短路问题(Floyd-Warshall算法)

    /* 任意两点间的最短路问题(Floyd-Warshall算法)*/import java.util.Scanner;public class Main {//图的顶点数,总边数static int ...

  2. 地铁线路图中任意两点间所有路径高效算法

    在求图线任意两点间最短路径时,利用floyd.dijdstra等成熟的算法可以求得,效率还不错.但要求换乘最少.最舒适等路径时,需要求线网图中任意两个点的所有路径,然后根据条件筛选,以上算法无能为力. ...

  3. AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...

  4. C++floyd warshall算法求最短路径(附完整源码)

    C++floyd warshall算法求最短路径 floyd warshall算法求最短路径的完整源码(定义,实现,main函数测试) floyd warshall算法求最短路径的完整源码(定义,实现 ...

  5. Floyd Warshall算法

    Description: 描述: This is a very popular interview problem to find all pair shortest paths in any gra ...

  6. matlab求两点间距离,matlab如何求一个N*2的矩阵的任意两点间的距离?

    matlab如何求一个N*2的矩阵的任意两点间的距离? mip版  关注:64  答案:3  悬赏:0 解决时间 2021-02-23 20:55 已解决 2021-02-23 16:37 假设有个矩 ...

  7. 图论 ---- F. The Shortest Statement (最短路的性质 + 任意两点间最短路 + 图转树)

    题目链接 题目大意: 给你一个nnn个点mmm条边的无向图,就是动态询问任意两点间的最短路 n,m∈[1,1e5],m−n≤20n,m\in[1,1e5],m-n\leq20n,m∈[1,1e5],m ...

  8. golang计算任意两点间的方位角

    计算任意两点间的方位角 方位角是从某点的指北经线起,依顺时针方向到目标方向线之间的水平夹角(如图所示θ,可以将其看成是指南针所指示的角度),也即是OPN平面与OPQ平面的所构成的二面角大小. 以北极点 ...

  9. 计算球面上任意两点间的球面距离(C++实现)

    文章目录 1 预备知识 2 原理描述 3 代码实现 1 预备知识 在求解此问题之前首先要明确一下几点: (1)两点间的球面距离: 球面上两点间的最短距离,即球心与球面上两点所确定的平面与球面相交,得到 ...

最新文章

  1. CNCF案例研究:奇虎360
  2. android驱动代码,GitHub - rumengsuifeng/AndroidDrivers: Android驱动的代码
  3. 电脑硬盘数据线_这40种电脑故障的排除技巧你都掌握了吗?
  4. 挖一挖那些让公司网站瘫痪的SQL“终结者”
  5. ubuntu14.04 安装tensorflow始末
  6. 最新Dynamips for工大瑞普模拟器7.2正式完全版和使用指南
  7. 易语言PHP查询卡号,易语言卡密管理源码,易语言卡号密码管理软件源码
  8. Linux学习--CentOS可视化配置网络
  9. sql注入之——sql注入防御方法
  10. python成绩统计_利用python进行学生成绩分析
  11. 谷歌中国六月过三关 研发团队已失七将
  12. 联合国儿童基金会宣布与微软达成新合作
  13. 显卡mx150和230哪个好_MX250和MX150哪个好 MX250和MX150显卡对比全方位评测[多图]
  14. 区块链技术培训—从技术小白到年薪百万区块链工程师的进阶之路
  15. potato社交苹果版下载-potato土豆社交ios下载
  16. Redis 知识点扫盲
  17. 2021年下半场品牌入局小红书的三板斧-小红书数据分析
  18. IDEA license server 地址
  19. 新华社 | 郭为:IT构架创新助力中国金融科技创新之路
  20. 在Linux命令行终端中写python代码的简单操作

热门文章

  1. 常用计算机服务,常用计算机端口对应的服务(The commonly used computer port corresponding service).doc...
  2. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
  3. Neo4j简单的样例
  4. ionic@2.0 beta版本安装指南
  5. entry for sde instance not found in services file解决方法[转]
  6. 【JavaScript】理解与使用Javascript中的回调函数
  7. 11月27日struts项目练习评审
  8. 兴趣记忆法(1)顺口溜记忆
  9. 操作系统实验报告13:线程池简单实现
  10. [Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算