算法Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)相关的知识,希望对你有一定的参考价值。

求解所有两点间的最短路问题叫做任意两点间的最短路问题。

可以用动态规划来解决,

d[k][i][j] 表示只用前k个顶点和顶点i到顶点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的最路路径+j离k的最短路径。

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

 

也有二维的表示法:

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]表示边e=(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++){
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }
} 


int main(){
} 

 

 

负圈的判断:

判断负圈只用判断是否有 d[i][i] 为负数即可。

以上是关于算法Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

单源最短路(bellman-ford算法+dijkstra算法)+任意两点最短路(floyd-warshall算法)

Floyd-Warshall算法(最短路)

多源最短路径--Floyd-Warshall算法

Floyd算法解决多源最短路径问题