C语言迪杰斯特拉实现最短路径算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二、系统分析
设计一个旅游咨询系统, 能咨询从任何一个城市顶点到其他城市顶点之间的 最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入 城市间的路程、 所需时间或是所需费用等信息。旅客可以在同一个系统中综合考 虑自己的各目标城市,选择一个最佳的旅游路线和出行方式。 针对最短路径问题, 在本系统中采用图的相关知识, 采用了迪杰斯特拉算法, 解决在实际情况中的最短路径问题,而迪杰斯特拉算法的时间复杂度为 O(n2), 空间复杂度为 O(n)。本系统使用邻接矩阵存储无向图。其中,建立矩阵的时间 复杂度为 O(n ),但是利用其查找一条边的时间复杂度为 O(1)。本系统中包括了 利用邻接矩阵建立图的存储结构和单源最短问题两大部分, 使用指针数组实现利 用一个程序实现最短路径和最短时间的运算。 并且本系统设置了人性化的系统提 示菜单,方便使用者的使用。
2
-2-
旅游咨询系统设计
ቤተ መጻሕፍቲ ባይዱ
三、概要设计
一、 系统划分
该系统可以划分为三个部分: 1、 利用邻接矩阵建立图的存储结构; 2、 利用迪杰斯特拉算法解决单源最短路径问题; 3、 实现城市之间的最短路径问题和最短时间问题。
-3-
旅游咨询系统设计
二、邻接矩阵建立流程图:
-4-
旅游咨询系统设计
-5-
旅游咨询系统设计
-6-
旅游咨询系统设计
{ enum boolean S[MVNum]; /*终点集合*/ int dist[MVNum],path[MVNum]; /*dist 表示源点 v0 到图中其余顶点的最短长度,path 表示其对应的路径*/ int i,wmin,u,num=1,k; for(i=1;i<=N;i++) /*数组 dist 和集合 S 付初值*/ {dist[i]=G[a]->arcs[v0][i]; /*数组 dist 初值为邻接矩阵*/ S[i]=0; /*集合 S 初值设为空集*/ if(dist[i]<Maxint) path[i]=v0; else path[i]=0; } S[v0]=1; /*源点 v0 放入集合 S 中*/ path[v0]=0; do{wmin=Maxint; /*wmin 最小值设为无穷大*/ u=v0; for(i=1;i<=N;i++) if(S[i]==0) /*选择不在 S 中且距离最小的顶点 u*/ if((dist[i]<wmin)&&(dist[i]!=0)) {u=i; wmin=dist[i];} S[u]=1; /*把距离最小的顶点 u 放入集合 S 中*/ for(i=1;i<=N;i++) /*修改不在 S 中的顶点距离*/ if(S[i]==0) if(dist[u]+G[a]->arcs[u][i]<dist[i]) {dist[i]=dist[u]+G[a]->arcs[u][i]; path[i]=u; } num++; }while(num<=N); printf("\n\t 输出带权无向图的单元最短路径为:\n\t");/*打印 v0 到其他顶点的最短路 径*/ for(i=1;i<=N;i++) {if(S[i]==1) {k=i; printf("\n\t 顶点%d 到%d 之间的路径为:",v0,i); while(k!=v0) {printf("%d<--",k); /*输出后继顶点*/ k=path[k]; /*继续寻找下一个后继顶点*/ } printf("%d",k); /*输出终点*/ printf(",最短路径长度为%d\n",dist[i]); /*输出最短路径*/ } else printf("\n\t 顶点%d 到%d 之间没有路径!",v0,i); }
-7-
旅游咨询系统设计
printf("\n\t 求一个城市到所有城市的最短路径结束,谢谢!\n\n\t\t"); } void main() /*旅游咨询系统*/ { int n,e,v,u,i,x; int z=0; G[1]=(mgraph *)malloc(sizeof(mgraph)); /*建立类型为 mgraph 的十字链表结构*/ G[2]=(mgraph *)malloc(sizeof(mgraph)); printf("****************欢迎使用旅游咨询系统****************\n"); printf("输入图中顶点个数和边数 n,e:"); scanf("%d,%d",&n,&e); city_number(); for(i=1;i<=n;i++) /*输入顶点信息*/ {printf("\n 请输入图的所有顶点 i="); scanf("%d",&x); G[1]->vexs[i]=x; /*将顶点信息输入一维数组中*/ G[2]->vexs[i]=x; } printf("\n 请输入距离矩阵的数值\n"); Createmgraph(1,n,e); /*建立距离矩阵*/ printf("\n 距离矩阵建立 完毕\n 请输入时间矩阵的数值"); Createmgraph(2,n,e); /*建立时间矩阵*/ printf("\n 无向图的存储结构建立完毕!\n"); do { printf("\n\n\n************进行最短查询************\n"); printf("=========================================\n"); printf("1.求一个城市到所有城市的最短路径\n"); printf("2.求一个城市到所有城市的最短时间\n"); printf("3.退出\n"); printf("=========================================\n"); printf("请输入选择:"); scanf("%d",&z); /*输入选择选择矩阵*/ city_number(); if(z==1) {printf("\n 选择 1 求一个城市到所有城市的最短路径\n"); printf("求单源路径,输入源点 v :"); /*输入源点 v0*/ scanf("%d",&v); Dijkstra(1,v,n); /*计算最短距离*/ } else if(z==2) {printf("\n 选择 2 求一个城市到所有城市的最短时间\n"); printf("求单源路径,输入源点,u :");
四、详细设计
本课程设计的源程序如下所示:
#include<stdio.h> #include<stdlib.h> #define MVNum 100 #define Maxint 9999 /*将无穷大的数值设为 9999*/ typedef char vertextype;/*建立无向图*/ typedef int adjmatrix; typedef struct { vertextype vexs[MVNum]; adjmatrix arcs[MVNum][MVNum]; }mgraph; mgraph *G[2]; /*设置指针数组用以实现距离和时间最小值求取*/ void city_number() /*输出城市代表序号*/ { printf("********************************************************************* ****\n"); printf(" 1、北京 2、上海 3、香港 4、天津 5、重庆 6、澳门 7、哈尔滨 8、石家庄"); printf(" \n 9、兰州 10、昆明 11、成都 12、长春 13、沈阳 14、长沙 15、海口 16、 西安"); printf("\n********************************************************************* ****\n"); } void Createmgraph(int a,int n,int e) /*建立无向邻接矩阵*/ {int i,j,k; int w; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) G[a]->arcs[i][j]=0; /*邻接矩阵对角线初始值设为 0*/ else G[a]->arcs[i][j]=Maxint; /*其他元素设为无穷大*/ for(k=1;k<=e;k++) /*读入 e 条边数的信息*/ {printf("\n 输入图中各起点终点及其权值 i,j,w:"); /*读入无向边及其权值*/ scanf("%d,%d,%d",&i,&j,&w); G[a]->arcs[i][j]=w; G[a]->arcs[j][i]=w; } } void Dijkstra(int a,int v0,int N)/*Dijkstra 算法的实现和打印*/
数据结构课程设计报告 ----旅游咨询系统设计
旅游咨询系统设计
目录
一、需求分析................................................................................................................................ - 2 二、系统分析................................................................................................................................ - 2 三、概要设计................................................................................................................................ - 3 一、 系统划分................................................................................................................ - 3 二、 邻接矩阵建立流程图:........................................................................................ - 4 三、 迪杰斯特拉算法流图.............................................................. 错误!未定义书签。 四、详细设计................................................................................................................................ - 6 五、调试分析................................................................................................................................ - 9 一、运行结果................................................................................................................ - 9 二、改进设想.............................................................................................................. - 13 六、课设总结.............................................................................................................................. - 13 -
-1-
旅游咨询系统设计
旅游咨询系统设计
一、需求分析
在交通网络日益发达的今天,人们出行有很多种方式、路线,而如何选择符 合需要的方式路线成为大家的一大难题。所以,在此我利用计算机建立一个旅游 咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边 表示各个城市之间的路线,所带权值为两个城市间的路程、时间或车费等。这个 交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从 A 城到 B 城里程最短; 如何选择一条路径使得从 A 城到 B 城花费最低;如何选择一 条路径使得从 A 城到 B 城所用的时间最少等等的一系列问题。
相关文档
最新文档