代码 // 存图方式为邻接矩阵 // 方便遍历操作 // a存储的是从i到j的最短的距离,path存储的是从i到j需要经过的一个中间节点 void print_path(int a[][MAXN], int u, int v, int path[][MAXN]) { if (a[u][v] == INF) return ; else { if (a[u][v] == -1) // 直接输出当前边 else { int mid = a[u][v]; print_path(a, u, mid, path); // 起点到中间点的路径 print_path(a, mid, v, path); // 中间点到终点的后半段路径 } } } void floyd(int G[][MAXN], int path[][MAXN], int a[][MAXN], int n) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { a[i][j] = G[i][j]; path[i][j] = -1; } } for (int k=0; k<n; k++) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (a[i][j] > a[i][k] + a[k][j]) { a[i][j] = a[i][k] + a[k][j]; path[i][j] = k; } } } } }