1. /*
    2. floyd算法:
    3. 我们会设置一个dist数组和path数组,dist数组用于描述i到j的权值,
    4. path数组用于描述i到j经过那个顶点
    5. */
    6. #define MAXSIZE 100
    7. #include <stdio.h>
    8. #include <stdlib.h>
    9. typedef struct Graph {
    10. int Vertex[MAXSIZE];
    11. int Edge[MAXSIZE][MAXSIZE];
    12. int numV, numE;//顶点、边数量
    13. }adjMatrix;
    14. void floyd(adjMatrix *G,int path[][MAXSIZE]) {
    15. int i, j, k;
    16. int dist[MAXSIZE][MAXSIZE];
    17. for (int m = 0; m < G->numV; m++) {
    18. for (int n = 0; n < G->numV; n++) {
    19. dist[m][n] = G->Edge[m][n];//初始化顶点间距离
    20. path[m][n] = -1;//初始化路径
    21. }
    22. }
    23. for (k = 0; k < G->numV; k++) {//依次加入所有的顶点
    24. for (i = 0; i < G->numV; i++) {
    25. for (j = 0; j < G->numV; j++) {
    26. if (dist[i][j] > G->Edge[i][k] + G->Edge[k][j]) {//加入k后有更短的,更新
    27. dist[i][j] = G->Edge[i][k] + G->Edge[k][j];//更改dist
    28. path[i][j] = k;//path更改
    29. }
    30. }
    31. }
    32. }
    33. for (int i = 0; i < G->numV; i++)
    34. {
    35. for (int j = 0; j < G->numV; j++)
    36. printf("%2d ", dist[i][j]);
    37. printf("\n");
    38. }
    39. }
    40. void printPath(int path[][MAXSIZE],int vi,int vj) {
    41. if (path[vi][vj]==-1) {//直接输出
    42. printf("%d ",vj+1);
    43. }
    44. else {
    45. int mid = path[vi][vj];
    46. printPath(path, vi, mid);
    47. printPath(path,mid,vj);
    48. }
    49. }
    50. int main() {
    51. void createGraphFromFile(adjMatrix *);
    52. void dispGraph(adjMatrix *);
    53. adjMatrix *G = (adjMatrix *)malloc(sizeof(adjMatrix));
    54. createGraphFromFile(G);
    55. dispGraph(G);
    56. int path[MAXSIZE][MAXSIZE];
    57. floyd(G,path);
    58. printPath(path,1,3);
    59. return 0;
    60. }