一、设计目的与内容
1.设计目的
(1).熟悉图的邻接链表存储结构。
(2).熟悉图的邻接链表的建立。
(3).掌握图的遍历算法。
(4).熟练掌握迪杰斯特拉算法和费洛伊德算法,能够利用它们解决最短路径问题。
(5).能够解决工程项目实施过程中的关键路径问题。
2.设计内容:
设计一个交通咨询系统,能让旅客咨询从任一个城市定点到另一个城市定点之间的最短路径
或最低花费或最少时间等问题。对于不同的咨询要求、可输入城市间的路程或所需时间或所
需花费。
要求:
(1).建立交通网络网的存储结构。
(2).提供程序测试方案。
(3).界面友好。
二、 算法的基本思想
实验分三个部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实
现两个城市顶点之间的最短路径问题。
1. 建立图的存储结构
首先定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设 G=
(V,E)是具有 n 个顶点的图,则 G 的邻接矩阵是具有如下定义的 n 阶方阵。
A[i,j]=
Wij
0
或
vi
,
vj
)
或
(
,若
(
);
GE
。
,当不满足上述条件时
vi
,
vj
一个图的邻接矩阵表示是唯一的。图的邻接矩阵表示,除了需要用一个二维数
组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有 n 个元素的一维
数组来存储顶点信息,其中下标为 i 的元素存储顶点 vi 的信息
2. 单源最短路径
初始化 S 和 D,置空最短路径终点集,置初始的最短路径值;
S[v1]=TRUE;D[v1]=0;//S 集初始时只有源点,源点到源点的距离为 0;
while(S 集中顶点数
虑从 vi 到 vj 是否包含有顶点 v2 为中间顶点的路径〈vi,…,v2,…,vj〉,若没有,
则说明从 vi 到 vj 的当前最短路径就是前一步求出的;若有,那么〈vi,…,v2,…,
vj〉可分解为〈vi,…,v2〉和〈v2,…,vj〉,而这两条路径是前一次找到的中间点序
号不大于 1 的最短路径,将这两条路径长度相加就得到路径〈vi,…,v2,…,vj〉的
长度。将该长度与前一次中求出的从 vi 到 vj 的中间顶点序号不大于 2 的最短路径。依
次类推,直至顶点 vn 加入当前从 vi 到 vj 的最短路径后,选出从 vi 到 vj 的中间顶点序
号不大于 n 的最短路径为止。由于图 G 中顶点序号不大于 n,所以 vi 到 vj 的中间顶点
序号不大于 n 的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是
vi 到 vj 的最短路径。
三、测试数据
输入图中顶点个数和边数 n,e: 7,10
输入 10 条边的 i,j 及 w:
1,7,9
2,1,20
2,3,10
2,4,30
3,5,5
5,4,12
5,7,15
6,5,8
6,7,10
7,3,18
有向图的存储结构建立完毕!
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 1
求单源路径,输入源点 v: 1
路径长度
路径
0
32767
27
44
32
32767
9
1
2
3<-7<-1
4<-5<-3<-7<-1
5<-3<-7<-1
6
7<-1
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 2
dij=29,pij=1
dij=15,pij=3
dij=23,pij=3
dij=27,pij=3
dij=17,pij=5
dij=20,pij=5
dij=20,pij=5
dij=35,pij=3
dij=38,pij=3
dij=27,pij=7
dij=44,pij=7
dij=32,pij=7
dij=38,pij=5
dij=33,pij=7
dij=38,pij=7
dij=28,pij=7
输入源点(或称起点)和终点:v,w: 2,4
从顶点 2 到 4 的最短路径是: 2->3->5->4 路径长度: 27
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 2
dij=29,pij=1
dij=15,pij=3
dij=23,pij=3
dij=27,pij=3
dij=17,pij=5
dij=20,pij=5
dij=20,pij=5
dij=35,pij=3
dij=38,pij=3
dij=27,pij=7
dij=44,pij=7
dij=32,pij=7
dij=38,pij=5
dij=33,pij=7
dij=38,pij=7
dij=28,pij=7
输入源点(或称起点)和终点:v,w: 1,4
从顶点 1 到 4 的最短路径是: 1->7->3->5->4 路径长度: 44
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 0
输入图中顶点个数和边数 n,e: 7,20
输入 20 条边的 i,j 及 w:
1,2,2553
2,1,2553
1,3,695
3,1,695
1,4,704
4,1,704
2,3,511
3,2,511
2,5,812
5,2,812
3,4,349
4,3,349
3,6,1579
6,3,1579
4,7,651
7,4,651
5,6,2368
6,5,2368
6,7,1385
7,6,1385
有向图的存储结构建立完毕!
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 1
求单源路径,输入源点 v: 1
路径长度
路径
0
1206
695
704
2018
2274
1355
******求城市之间的最短路径******
1
2<-3<-1
3<-1
4<-1
5<-2<-3<-1
6<-3<-1
7<-4<-1
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 2
dij=5106,pij=1
dij=3257,pij=1
dij=1390,pij=1
dij=3257,pij=1
dij=1408,pij=1
dij=5106,pij=2
dij=3365,pij=2
dij=1022,pij=2
dij=1323,pij=2
dij=4069,pij=1
dij=3365,pij=2
dij=1323,pij=2
dij=4069,pij=2
dij=1624,pij=2
dij=1390,pij=3
dij=1206,pij=3
dij=2018,pij=3
dij=2274,pij=3
dij=1206,pij=3
dij=1022,pij=3
dij=860,pij=3
dij=2090,pij=3
dij=860,pij=3
dij=698,pij=3
dij=1672,pij=3
dij=1928,pij=3
dij=2018,pij=2
dij=1672,pij=2
dij=2274,pij=3
dij=2090,pij=3
dij=1928,pij=3
dij=3158,pij=3
dij=1355,pij=4
dij=1511,pij=3
dij=698,pij=4
dij=1000,pij=4
dij=2323,pij=2
dij=1355,pij=4
dij=1511,pij=4
dij=1000,pij=4
dij=2323,pij=4
dij=1302,pij=4
dij=2770,pij=7
输入源点(或称起点)和终点:v,w: 5,7
从顶点 5 到 7 的最短路径是: 5->2->3->4->7 路径长度: 2323
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 2
dij=5106,pij=1
dij=3257,pij=1
dij=1390,pij=1
dij=3257,pij=1
dij=1408,pij=1
dij=5106,pij=2
dij=3365,pij=2
dij=1022,pij=2
dij=1323,pij=2
dij=4069,pij=1
dij=3365,pij=2
dij=1323,pij=2
dij=4069,pij=2
dij=1624,pij=2
dij=1390,pij=3
dij=1206,pij=3
dij=2018,pij=3
dij=2274,pij=3
dij=1206,pij=3
dij=1022,pij=3
dij=860,pij=3
dij=2090,pij=3
dij=860,pij=3
dij=698,pij=3
dij=1672,pij=3
dij=1928,pij=3
dij=2018,pij=2
dij=1672,pij=2
dij=2274,pij=3
dij=2090,pij=3
dij=1928,pij=3
dij=3158,pij=3
dij=1355,pij=4
dij=1511,pij=3
dij=698,pij=4
dij=1000,pij=4
dij=2323,pij=2
dij=1355,pij=4
dij=1511,pij=4
dij=1000,pij=4
dij=2323,pij=4
dij=1302,pij=4
dij=2770,pij=7
输入源点(或称起点)和终点:v,w: 7,2
从顶点 7 到 2 的最短路径是: 7->4->3->2 路径长度: 1511
******求城市之间的最短路径******
============================================
1.求一个城市到所有城市的最短路径
2.求任意的两个城市之间的最短路径
============================================
请选择: 1 或 2,选择 0 退出: 0
四、源程序及系统文件使用说明
#include
#include
#define MVNum 100
#define Maxint 32767
enum boolean{FALSE,TRUE};
typedef char VertexType;
typedef int Adjmatrix;
typedef struct{
VertexType vexs[MVNum];
Adjmatrix arcs[MVNum][MVNum];
}MGraph;
int D1[MVNum],P1[MVNum];
int D[MVNum][MVNum],P[MVNum][MVNum];
void CreateMGraph(MGraph *G,int n,int e);
void Dijkstra(MGraph *G,int v1,int n);
void Floyd(MGraph *G,int n);
void main()
{ MGraph *G;
int m,n,e,v,w,k;
int xz=1;
G=(MGraph *)malloc(sizeof(MGraph));
printf("输入图中顶点个数和边数 n,e: ");
scanf("%d,%d",&n,&e);