问题与代码:
头文件graph.h和源文件graph.cpp代码详见图的算法库
测试图如下:
主函数main.cpp代码:
- <span style="font-size:12px;">#include <stdio.h>
- #include <malloc.h>
- #include "graph.h"
- #define MaxSize 100
- void Ppath(int path[][MAXV],int i,int j)
- {
- int k;
- k=path[i][j];
- if (k==-1) return;
- Ppath(path,i,k);
- printf("%d,",k);
- Ppath(path,k,j);
- }
- void Dispath(int A[][MAXV],int path[][MAXV],int n)
- {
- int i,j;
- for (i=0; i<n; i++)
- for (j=0; j<n; j++)
- {
- if (A[i][j]==INF)
- {
- if (i!=j)
- printf("从%d到%d没有路径\n",i,j);
- }
- else
- {
- printf(" 从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);
- printf("%d,",i);
- Ppath(path,i,j);
- printf("%d\n",j);
- }
- }
- }
- void Floyd(MGraph g)
- {
- int A[MAXV][MAXV],path[MAXV][MAXV];
- int i,j,k;
- for (i=0; i<g.n; i++)
- for (j=0; j<g.n; j++)
- {
- A[i][j]=g.edges[i][j];
- path[i][j]=-1;
- }
- for (k=0; k<g.n; k++)
- {
- for (i=0; i<g.n; i++)
- for (j=0; j<g.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;
- }
- }
- Dispath(A,path,g.n);
- }
- int main()
- {
- MGraph g;
- int A[4][4]=
- {
- {0, 5,INF,7},
- {INF,0, 4,2},
- {3, 3, 0,2},
- {INF,INF,1,0}
- };
- ArrayToMat(A[0], 4, g);
- Floyd(g);
- return 0;
- }</span>
运算结果:
知识点总结:
Floyd算法,基本思想是递归产生一个矩阵序列A0、A1、....、Ak、....An,其中Ak[i][j]表示从顶点i到顶点j 的路径上所经过的顶点编号不大于k的最短路径长度。
学习心得:
多练习。