/* floyd算法: 我们会设置一个dist数组和path数组,dist数组用于描述i到j的权值, path数组用于描述i到j经过那个顶点*/#define MAXSIZE 100#include <stdio.h>#include <stdlib.h>typedef struct Graph { int Vertex[MAXSIZE]; int Edge[MAXSIZE][MAXSIZE]; int numV, numE;//顶点、边数量}adjMatrix;void floyd(adjMatrix *G,int path[][MAXSIZE]) { int i, j, k; int dist[MAXSIZE][MAXSIZE]; for (int m = 0; m < G->numV; m++) { for (int n = 0; n < G->numV; n++) { dist[m][n] = G->Edge[m][n];//初始化顶点间距离 path[m][n] = -1;//初始化路径 } } for (k = 0; k < G->numV; k++) {//依次加入所有的顶点 for (i = 0; i < G->numV; i++) { for (j = 0; j < G->numV; j++) { if (dist[i][j] > G->Edge[i][k] + G->Edge[k][j]) {//加入k后有更短的,更新 dist[i][j] = G->Edge[i][k] + G->Edge[k][j];//更改dist path[i][j] = k;//path更改 } } } } for (int i = 0; i < G->numV; i++) { for (int j = 0; j < G->numV; j++) printf("%2d ", dist[i][j]); printf("\n"); }}void printPath(int path[][MAXSIZE],int vi,int vj) { if (path[vi][vj]==-1) {//直接输出 printf("%d ",vj+1); } else { int mid = path[vi][vj]; printPath(path, vi, mid); printPath(path,mid,vj); }}int main() { void createGraphFromFile(adjMatrix *); void dispGraph(adjMatrix *); adjMatrix *G = (adjMatrix *)malloc(sizeof(adjMatrix)); createGraphFromFile(G); dispGraph(G); int path[MAXSIZE][MAXSIZE]; floyd(G,path); printPath(path,1,3); return 0;}