使用的是在线编译器
在线编译器 -- C/C++、Java、Python... | Techie Delight
#include <stdio.h>
#define V 6 //设定图中的顶点数
#define INF 65535 // 设置一个最大值
int P[V][V] = { 0 }; //记录各个顶点之间的最短路径
void printMatrix(int matrix[][V]); //输出各个顶点之间的最短路径
void printPath(int i, int j); // 递归输出各个顶点之间最短路径的具体线路
void floydWarshall(int graph[][V]); // 实现弗洛伊德算法
int main() {
// 有向加权图中各个顶点之间的路径信息
int graph[V][V] = { {0, INF, 1,INF, INF, INF},
{3, 0, INF, 4, 1, INF},
{INF, 5, 0, INF, 1, 5},
{INF, INF, INF, 0, 1, INF},
{INF, INF, INF, INF, 0, 3},
{INF, 2, INF, 5, INF, 0}};
floydWarshall(graph);
}
// 中序递归输出各个顶点之间最短路径的具体线路
void printPath(int i, int j)
{
int k = P[i][j];
if (k == 0)
return;
printPath(i, k);
printf("%d-", k + 1);
printPath(k, j);
}
// 输出各个顶点之间的最短路径
void printMatrix(int graph[][V]) {
int i, j;
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
if (j == i) {
continue;
}
printf("%d - %d: 最短路径为:", i + 1, j + 1);
if (graph[i][j] == INF)
printf("%s\n", "INF");
else {
printf("%d", graph[i][j]);
printf(",依次经过:%d-", i + 1);
//调用递归函数
printPath(i, j);
printf("%d\n", j + 1);
}
}
}
}
// 实现弗洛伊德算法,graph[][V] 为有向加权图
void floydWarshall(int graph[][V]) {
int i, j, k;
//遍历每个顶点,将其作为其它顶点之间的中间顶点,更新 graph 数组
for (k = 0; k < V; k++) {
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
//如果新的路径比之前记录的更短,则更新 graph 数组
if (graph[i][k] + graph[k][j] < graph[i][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
//记录此路径
P[i][j] = k;
}
}
}
}
// 输出各个顶点之间的最短路径
printMatrix(graph);
}
