Floyd算法用于求一个带权有向图(Wighted Directed Graph)的任意两点距离的算法,运用了动态规划的思想,算法的时间复杂度为O(n^3)。具体方法是:设点i到点j的距离为d[i][j],循环尝试插入点k,若能使得d[i][k]+d[k][j]的距离变短,则插入点k,否则不插入。C++代码如下:
#include<iostream> using namespace std; int Floyd(int *d[],int n) //d[][]为点i到点j的有向直线距离 { for(int i=0;i<n;i++) //前两层循环针对点i和点j for(int j=0;j<n;j++) for(int k=0;k<n;k++) //第三层循环尝试插入点k d[i][j] = min(d[i][j],d[i][k]+d[k][j]);//动态规划的思想 } int main() //举例说明 { const int n = 7,M=9999999;//M很大,d[i][j]=M表示没有从i指向j的有向路径 int d[n][n] = {{0,3,2,1,M,M,M}, {M,0,M,M,2,M,4}, {M,M,0,M,2,M,M}, {M,M,M,0,2,7,M}, {M,M,M,M,0,M,2}, {M,M,M,M,M,0,3}, {M,M,M,M,M,M,0}}; int **D = new int*[n]; for(int i=0;i<n;i++) { D[i] = new int[n]; for(int j=0;j<n;j++) D[i][j] = d[i][j]; } Floyd(D,n); cout << D[0][n-1] << endl; return 0; }