问题
用Floyd算法求解下图各个顶点的最短距离。
-
解析
Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。
Floyd-Warshall算法的原理是动态规划。
#include<stdio.h>
#include<stdlib.h>
int main() {
int d[10][10], i, j, k, n, m, x, y, z;
printf("输入顶点数和边数:\n");
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (i == j) {
d[i][j] = 0;
}
else {
d[i][j] = 10000;
}
}
}
printf("输入从?顶点到?顶点的距离?:");
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &x, &y, &z);
d[x][y] = z;
}
for (k = 1; k <= n; k++) {
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (d[i][j] > d[i][k] + d[k][j]) {
d[i][j] = d[i][k] + d[k][j];
}
}
}
}
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
printf("%d", d[i][j]);
if (j != n) {
printf(" ");
}
else {
printf("\n");
}
}
}
return 0;
}