開始知道Floyd算法是在《大话数据结构》这本书的无向带权图求最短路径看到的,
可是第一次没怎么看懂,所以就不看了,后来又看了两遍还是没明确,我以为是我理解能力有问题
后来从百度百科上看了一遍。一次就懂了,事实上就是动态规划
状态转移方程d[i][j] = min(d[i][k] + d[k][j], d[i][j])
状态转移方程求得的是i到j的最短路径
#include<stdio.h> #include<stdlib.h> #define INF 1 << 30 int d[1000][1000]; int main() { int i, j, k, m, n; //m代表边数,n代表顶点数 int x, y, z; scanf("%d%d", &n, &m); //权值初始化 for (i = 0; i < n; i++) for (j = 0; j < n; j++) d[i][j] = INF; //邻接矩阵图的建立 for (i = 0; i < m; i++) { scanf("%d%d%d", &x, &y, &z); d[x][y] = z; d[y][x] = z; } for (k = 0; k < n; k++) for (i = 0; i < n; i++) for (j = 0; j < n; j++) { if (d[i][k] + d[k][j]<d[i][j]) d[i][j] = d[i][k] + d[k][j]; } for (i = 0; i < n; i++){ for (j = 0; j < n; j++) printf("%d ", d[i][j]); puts(""); } return 0; }