算法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算法(任意两点间的最短路问题)(判断负圈)的主要内容,如果未能解决你的问题,请参考以下文章
AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)(代码