Floyed的主程序段很精简,就是3重循环。
for (k = 0; k < n; k ++)
for (i = 0; i < n; i ++)
if (i != k) for (j = 0; j < n; j ++)
if ((j != i && j != k) && (map[i][k] + map[k][j] < map[i][j]))
map[i][j] = map[i][k] + map[k][j];
参考程序
//读入顶点总数n,边总数m,和m行的边信息(此处为无向图)。
//输出从起点到其它所有点的最短路
//例如:
//5 9 (顶点数为5, 9条边)
//1 2 3 (第一条边的信息顶点1和顶点2相连,权值为3)
//1 5 30
//2 3 25
//2 4 8
//3 5 10
//4 1 20
//4 3 4
//4 5 12
//5 1 5
#include <stdio.h>
int map[201][201] = {0};
int path[201][201] = {0};
void write(int i , int j) //递归输出路径
{
if (path[i][j] > 0)
{
write(i , path[i][j]);
write(path[i][j] , j);
}
else printf("-->%d" , j);
}
int main()
{
int i , j , k , s , t , w , n , m;
//读入数据
scanf("%d %d" , &n , &m);
for (i = 0; i < m; i ++)
{
scanf("%d %d %d" , &s , &t , &w);
map[s][t] = w; map[t][s] = w;
}
//Floyed
for (k = 1; k <= n; k ++)
for (i = 1; i <= n; i ++)
if (k != i)
for (j = 1; j <= n; j ++)
if ((j != i) && (j != k) && (map[i][k] > 0) && (map[k][j] > 0) &&((map[i][j] == 0) || (map[i][k] + map[k][j] < map[i][j])))
{
map[i][j] = map[i][k] + map[k][j];
path[i][j] = k;
}
//此时map[i][j]表示i到j的最短路
//输出路径和最短距离
for (i = 1; i <= n; i ++)
for (j = 1; j <= n; j ++)
if (i != j)
{
printf("%d ==> %d : %d %d" , i , j , map[i][j] , i);
write(i , j);
printf("\n");
}
getchar(); getchar();
return 0;
}