码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-10-23 21:45:41      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:color   space   sha   rsh   动态   pac   class   规划   nbsp   

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

可以用动态规划来解决,

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算法(任意两点间的最短路问题)(判断负圈)

标签:color   space   sha   rsh   动态   pac   class   规划   nbsp   

原文地址:http://www.cnblogs.com/zhangjiuding/p/7718884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!