问题描述:数据结构上机实验报告题5:
设计并实现一个交通资讯系统。能够让旅客咨询从任何一个城市顶点到另一个城市顶点之间的最短路径问题。
要求:能够输出旅客所走路径
作者:何知令
设计并实现一个交通资讯系统。能够让旅客咨询从任何一个城市顶点到另一个城市顶点之间的最短路径问题。
要求:能够输出旅客所走路径
作者:何知令
完成时间:2016年6月25日
解题思想:
使用弗洛伊德算法依次遍历图中每个顶点,考量将其加入到图中任意两个顶点之间是否会使该两个顶点之间的路径(当前)剪短,若是,则在path[i][j]中记录下该顶点。依次迭代就可以得到图中任意两顶点之间的最短路径
难点:难点在于怎样理解该算法只在两顶点之间插如一个顶点但实现了长路径的求解,以及用于存储路径顶点和往前递归寻找路径顶点的过程
代码:
/*
问题描述:数据结构上机实验报告题5:
设计并实现一个交通资讯系统。能够让旅客咨询从任何一个城市顶点到另一个城市顶点之间的最短路径问题。
要求:能够输出旅客所走路径
作者:何知令
完成时间:2016年6月25日
*/
#include <stdio.h>
#define INF 32767 //INF表示∞
int a,b;//起点和终点
int path[7][7];//用于存放路径
int A[7][7]=//每个城市到另一个城市的路径,-1表示该城市到另一城市没有直接路径或者到自身
{
{0,4,6,6,INF,INF,INF},
{4,0,1,INF,7,INF,INF},
{6,1,0,2,6,4,INF},
{6,INF,2,0,INF,5,INF},
{INF,7,6,INF,0,1,6},
{INF,INF,4,5,1,0,8},
{INF,INF,INF,INF,6,8,0}
};
void Ppath(int i,int j) //前向递归查找路径上的顶点
{
int k;
k=path[i][j];
if (k==-1) return; //找到了起点则返回
Ppath(i,k); //找顶点i的前一个顶点k
printf("%d,",k);
Ppath(k,j); //找顶点k的前一个顶点j
}
void Floyd()
{
int i,j,k;
for (i=0; i<7; i++)
for (j=0; j<7; j++)
path[i][j]=-1;
for (k=0; k<7; k++)
{
for (i=0; i<7; i++)
for (j=0; j<7; j++)
if (A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
int main()
{
int i,j;
printf("下为一个城市的交通图(领接矩阵形式):\n");
for(i=0; i<7; i++)
{
for(j=0; j<7; j++)
{
if(A[i][j]==INF)
printf("\tINF\t");
else
printf("\t%d\t",A[i][j]);
if(j==6)
printf("\n");
}
}
printf("请输入起点和终点:\n");
scanf("%d %d",&a,&b);
Floyd();
printf("从城市%d到城市%d的路径长度:%d 路径为:",a,b,A[a][b]);
printf("%d,",a); //输出路径上的起点
Ppath(a,b); //输出路径上的中间点
printf("%d\n",b); //输出路径上的终点
return 0;
}
程序运行结果展示:
知识点总结:弗洛伊德算法及图的邻接矩阵
学习心得:开始怎么读都读不懂,后来还是老老实实在纸上写写,仔细想了想迭代的过程和具体实现长路径距离的寻找过程,才明白这个算法是怎么回事