读书人

用Floyd算法图中的两点间的最短路径

发布时间: 2012-07-20 10:38:30 作者: rapoo

用Floyd算法求一个图中的两点间的最短路径
#include <stdio.h>
#include <string.h>
#include <limits.h>

#define INFINITY INT_MAX
#define MAXSIZE 100
#define MAXVEX 6

#define FALSE 0

#define TRUE 1

typedef char VexType;

typedef float AdjType;

typedef struct

{ int vexnum; /* 图的顶点个数 */

VexType vexs[MAXVEX]; /* 顶点信息 */

AdjType arcs[MAXVEX][MAXVEX]; /* 边信息 */

}MGraph;

MGraph G;

AdjType D[MAXVEX][MAXVEX]; /*D(v)为v0到v的路径长度*/

int p[MAXVEX][MAXVEX][MAXVEX]; /*p(v)记录v0到v的最短路径,若p[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点*/

int final[MAXVEX]; /*final[v]为TRUE当且仅当v∈s,即已求得从v0到v的最短路径*/

void ShortestPath_FLOYD(MGraph G,int p[MAXVEX][MAXVEX][MAXVEX],AdjType D[MAXVEX][MAXVEX])
{//Floyd算法
int v,w,u,i;
for(v=0;v<G.vexnum;++v)
for(w=0;w<G.vexnum;++w)
{
D[v][w]=G.arcs[v][w];
for(u=0;u<G.vexnum;++u)
p[v][w][u]=FALSE;
if(D[v][w]<INFINITY)
{
p[v][w][u]=TRUE;
p[v][w][w]=TRUE;
}
}
for(u=0;u<G.vexnum;++u)
for(v=0;v<G.vexnum;++v)
for(w=0;w<G.vexnum;++w)
if(D[v][u]+D[u][w]<D[v][w])
{
D[v][w]=D[v][u]+D[u][w];
for(i=0;i<G.vexnum;i++)
p[v][w][i]=p[v][u][i]||p[u][w][i];
}
}
main()

{ int i,j,a,b,k;
int x[10];
G.vexnum=6;
scanf("%d%d",&a,&b);

for(i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY; /*G数组初始化最大值*/

G.arcs[0][1]=50; G.arcs[0][2]=10; G.arcs[1][2]=15; G.arcs[1][4]=5;

G.arcs[2][0]=20; G.arcs[2][3]=15; G.arcs[3][1]=20; G.arcs[3][4]=35;

G.arcs[4][3]=30; G.arcs[5][3]=3; G.arcs[0][4]=45; G.arcs[2][5]=11;
ShortestPath_FLOYD(G,p,D);
for(i=0;i<G.vexnum;i++) /*以邻接矩阵形式输出图*/
{ for(j=0;j<G.vexnum;j++)
printf("%11.0f ",G.arcs[i][j]);
printf("\n");
}
printf("\n");
printf("%.0f ",D[a][b]);
printf("\n");
}
以上程序是用Floyd算法求一个图中的两点间的最短路径
长度已经求出来了,但我希望能输出具体的路径,就是输出
最短路径的每一个结点,请哪位高手在我程序的基础上修改一下,
实现我的目的,谢谢!!

[解决办法]
Floyd算法是一个经典的动态规划。一个矩阵乘了n次,每乘一次都在作路径寻找和替换,你仔细看看这个算法的全过程,找几个规模小的图手动运行一下Floyd算法。要记录这个路径其实挺简单的,模仿dijstra算法就可以。代码自己写吧,这样理解更深一些。

读书人网 >C语言

热点推荐