1.问题
用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)
2.解析
3.设计
for (i = 0; i < V; ++i) {
count = 0;
for (j = 0; j < V; ++j) {
if(i != j){
S[i][j] = count;
}
else
S[i][j] = -1;
++count;
}
}
for (k = 0; k < V; ++k)
for (i = 0; i < V; ++i)
for (j = 0; j < V; ++j)
if (D[i][k] + D[k][j] < D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
S[i][j] = S[i][k];
}
4.分析
空间复杂度为O(n^2),
时间复杂度为O(n^3)
5.源码
#include<stdio.h>
#define max 100
#define inf 1000000
int main() {
int D[max][max] = { {inf,2,6,4},{inf,inf,3,inf},{7,inf,inf,1},{5,inf,12,inf} };
int S[max][max];
int i, j, k, V,count;
printf("输入节点个数:");
scanf("%d", &V);
for (i = 0; i < V; ++i) {
count = 0;
for (j = 0; j < V; ++j) {
if(i != j){
S[i][j] = count;
}
else
S[i][j] = -1;
++count;
}
}
for (k = 0; k < V; ++k)
for (i = 0; i < V; ++i)
for (j = 0; j < V; ++j)
if (D[i][k] + D[k][j] < D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
S[i][j] = S[i][k];
}
printf("各顶点最小距离矩阵为:\n");
for (i = 0; i < V; ++i) {
for (j = 0; j < V; ++j) {
if (i==j) {
printf("-1 ");
}
else
printf("%2d ", D[i][j]);
}
printf("\n");
}
}