使用动态规划计算任意两点间的最短路径,O(n^3)的复杂度,与基于Dijkstra的floyd算法复杂度一样, 但有些情况下有更好的性能 /* *时间:2010-05-13 *作者:heroyan *邮箱:zndxysf@126.com *QQ:357351104 *功能:求任意两结点之间最短路径长度 */ #include "stdio.h" const int INFINITY = 9999; int n = 3; int cost[10][10] = { {0,4,11}, {6,0,2}, {3,9999,0} }; int A[10][10]; int path[10][10]; //另一种实现:弗洛伊德算法,基于Dijstra算法 //本算法使用动态规划算法 void dynam() { int i,j,k; //将A初始化为cost for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { A[i][j] = cost[i][j]; path[i][j] = i; } } for(k = 0; k < n; ++k) { for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { if(A[i][j] > A[i][k]+A[k][j]) { A[i][j] = A[i][k]+A[k][j]; path[i][j] = k; } } } } } //打印结果 void print() { int i,j; for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { if(A[i][j] >= INFINITY) { printf("INFINITY "); } else { printf("%d ",A[i][j]); } } printf("/n"); } } void main() { dynam(); print(); }