【问题描述】

在交通网络非常发达、交通工具和交通方式不断更新的今天,人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需要的时间等问题也感兴趣。对于这样一个人们关心的问题,可用
一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。图中的顶点表示城市,边表示城市之间的交通关系。这个交通系统可以回答出行旅客提出的各种路径选择问题。例如,问题之一:“一位旅
客要从 A 城到 B 城,他希望选择一条途中中转次数最少的路线。”假设图中每一站都需要换车,那么这个问题反映到图上就是要找一条从顶点 A 到顶点 B 的所含边数目最少的路径。我们只需要从顶点 A 出发对图
作广度优先搜索,一旦遇到顶点 B 就终止。由此所得广度优先生成树上,从根顶点 A 到顶点 B 的路径就是中转次数最少的路径。路径上 A 与 B 之间的顶点就是路径的中转站,但这只是一类最简单的图的最短路径问题。系统还可以回答诸如此类的等等的路径选择问题。设计一个交通咨询系统,为出差、旅游或做其他出行的客人提供各种路径选择信息查询服务。

【基本要求】

设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。
本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。

建立图的存储结构

图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有 n 个元素的一维数组来存储顶点信息,其中下标为 i 的元素存储顶点 i 的信息。因此,图的邻接
矩阵的存储结构定义如下:

#define MVNum 50 //最大顶点数
typedef struct{VertexType vexs[MVNum]; //顶点数组,类型假定为 char 型Adjmatrix arcs[MVNum][MVNum]; //邻接矩阵,假定为 int 型
} MGraph; //图的邻接矩阵存储类型

单源最短路径

为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。
那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra)提出按路径长度递增产生诸点的最短路径算法,称之为迪杰斯特拉算法。

任意一对顶点间最短路径

任意一对顶点间最短路径问题,是对于给定的有向网络图 G=(V,E),要对 G 中任意一对顶点有序对 “v,w(v !=w)”,找出 v 到 w 的最短路径。
要解决这个问题,我们可以依次把有向网络图中每个顶点作为源点,重复执行前面讨论的迪杰斯特拉算法 n 次,即可以求得每对顶点之间的最短路径。这里还可以用另外一种方法,称作费洛伊德(Floyd) 算法。

【测试实例】

测试实例一
图 5-1 是一个有向图,求顶点a到其余顶点的最短路径。

为了操作方便,对于图的顶点可以用序号来表示的,顶点的字母就用其对应的序号来表示,如a用 1来代替,„„。

运行实例二
图 5-2 是一个简单的交通网络图。求顶点“北京”到其余各城市之间的最短路径;并分别求“成都”到“上海”之间以及“上海”到“西安”之间的最短路径。为了操作方便,对于图的顶点可以用序号来表示的,顶点的字母就用其对应的序号来表示,如北京用1 来代替,„„。

#include<stdio.h>
#include<stdlib.h>
#define MVNum 50    //最大顶点数
#define Maxint 35000
enum boolean{FALSE,TRUE};
typedef char VertexType;
typedef int Adjmatrix;
typedef struct
{VertexType vexs[MVNum];     //顶点数组,类型假定为char型Adjmatrix arcs[MVNum][MVNum];     //邻接矩阵,假定为int型
}MGraph;
int D1[MVNum],p1[MVNum];
int D[MVNum][MVNum],p[MVNum][MVNum];//采用邻接矩阵表示法构造有向图G
//n,e表示图的当前顶点数和边数
void CreateMGraph(MGraph *G,int n,int e)
{int i,j,k,w;for(i=1;i<=n;i++)   //输入顶点信息G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint;   //初始化邻接矩阵printf("输入%d条边的i,j及w:\n",e);for(k=1;k<=e;k++){//读入e条边,建立邻接矩阵scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图的存储结构建立完毕! \n");
}//dijkstra
//广度优先搜索
void Dijkstra(MGraph *G,int v1,int n)
{//用Dijikstra算法求有向图G的v1顶点到其他顶点v的最短路径p[v]及其权D[v]//S[v]为真当且仅当v属于s,及以求的从v1到v的最短路径int D2[MVNum],p2[MVNum];int v,i,w,min;enum boolean S[MVNum];for(v=1;v<=n;v++){//初始化 S 和 DS[v]=FALSE;          //置空最短路径终点集D2[v]=G->arcs[v1][v];      //置初始的最短路径值if(D2[v]<Maxint)p2[v]=v1;             //v1是的前趋(双亲)elsep2[v]=0;              //v无前趋}D2[v1]=0;         //S集初始时只有源点,源点到源点的距离为0S[v1]=TRUE;       //开始循环,每次求的V1到某个顶点的最短路径,并加V到S集中for (i=2;i<n;i++){//其余n-1个顶点min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){//找离v1最近的顶点w,并将其赋给v,距离赋给minv=w;min=D2[w];}S[v]=TRUE;for(w=1;w<=n;w++)if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){D2[w]=D2[v]+G->arcs[v][w];p2[w]=v;}}printf("路径长度 路径\n");for(i=1;i<=n;i++){printf("%5d",D2[i]);printf("%5d",i);v=p2[i];while(v!=0){printf("<-%d",v);v=p2[v];}printf("\n");}
}//floyd(费洛伊德算法)
//使用n*n二维数组储存路径信息
//D[i][j]:记录每一对顶点的最短距离
void Floyd(MGraph *G,  int n)
{int i, j, k;//储存每一对顶点之间的路径距离for(i=1;i<=n;j++)for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)p[i][j]=j;elsep[i][j]=0;D[i][j]=G->arcs[i][j];    }//k=1时只允许经过1号顶点进行中转//k=2时只允许经过1号和2号顶点进行中转//k=3......//k=4......for(k=1;k<=n;k++){for(i=1;i<=n;i++)for(j=1;j<=n;j++){//如果顶点i到k,k到j的距离大于i直接到j距离则i到j的距离则需经过k顶点中转if(D[i][k]+D[k][j]<D[i][j]){D[i][j]=D[i][k]+D[k][j];p[i][j]=p[i][k];}}}
}//v:起点
//w:终点
int main()
{MGraph *G;int n,e,v,w,k;int xz=1;      //算法选择标志G=(MGraph *)malloc(sizeof(MGraph));     //初始化图printf("输入图中顶点个数和边数n,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);    //建立有向图结构while(xz!=0){printf("    求城市之间的最短路径    \n");printf("----------------------\n");printf("1.求一个城市到所有城市的最短路径\n");printf("2.求任意的两个城市之间的最短路径\n");printf("-------------------\n");printf("请选择:1 或 2,  选择 0:退出   ");scanf("%d",&xz);if(xz==2)           //任意一对顶点间最短路径{Floyd(G,n);     printf("输入起点:");scanf("%d",&v);printf("输入终点:");scanf("%d",&w);k=p[v][w];     //k为v的后继结点if(k==0){printf("顶点%d 到 %d无路径!\n",v,w);}else{printf("从顶点%d到%d的最短路径是:%d",v,w,v);}while(k!=w){printf("-->%d",k);k=p[k][w];}printf("--%d",w);printf("路径长度:%d\n",D[v][w]);}if(xz==1){printf("求单源路径,输入起点 v:");scanf("%d",&v);Dijkstra(G,v,n);}}printf("结束求最短路径");
}

输入

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. 太原理工大学2021数据结构课程设计(交通咨询系统(最短路径问题))

    太原理工大学数据结构课程设计(交通咨询系统(最短路径问题)) 声明:这里只是给出核心代码 核心代码指程序的计算部分,不是完整程序 背景题目 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环 ...

  2. 用c语言设计交通咨询系统,交通咨询系统设计课程设计.doc

    交通咨询系统设计课程设计 课 程 设 计 报 告 课程名称 数据结构 课题名称 交通咨询系统 专 业 班 级 学 号 姓 名 指导教师 2013 年 月 日 设计内容与设计要求 1设计内容 [问题描述 ...

  3. 店铺咨询系统c语言,交通咨询系统数据结构c语言word文档良心出品

    <交通咨询系统数据结构c语言word文档良心出品>由会员分享,可在线阅读,更多相关<交通咨询系统数据结构c语言word文档良心出品(22页珍藏版)>请在人人文库网上搜索. 1. ...

  4. 数据结构--全国交通咨询系统(C语言)

    问题重述 处于不同目的的旅客对交通工具有不同的要求.例如,因公出差的旅客希望在旅途中的时间尽可能地短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少.编制一个全国城市间的交通咨询程序, ...

  5. 交通咨询系统(数据结构课设)

    目录 前言 选题题目 系统展示 写代码过程中出现的bug 我认为的存在的无关紧要的bug 源代码 参考文献 结语 前言 这学期做了一个数据结构的课设, 我的选题是交通咨询系统.硬性要求是组队完成,但是 ...

  6. 交通咨询系统的设计(数据结构 C语言)

    一.实验目的 1)熟悉并掌握图的存储结构: 2)熟悉并掌握单个最短路径算法: 3)熟悉并掌握任意两个顶点之间的最短路径算法. 二.实验内容 设计一个交通咨询系统,能让乘客咨询从一个城市顶点到另一个城市 ...

  7. c语言导游交通咨询系统,交通咨询系统(示例代码)

    在交通网络非常发达.交通工具和交通方式不断更新的今天, 人们在出差.旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也感兴趣.对于这样一个人们关心的问题,通过建立交通网络图的存储结 ...

  8. 我的第一篇课程设计(交通咨询系统)

    我因为当时课设选题的时候,不想随随便便,又我看了下那些题目,也就这个最难,而且我又注意到文档的修改日期,是2017年,所以就认为老师给老课题给我们做,是怕我们交不起作业,也由于老师自己长年教这课设,代 ...

  9. 交通咨询系统源代码(数据结构课设)

    系统的展示和选题在这篇博客:点击这里        (就没有详解啦,代码中的注释已经写的很详细了) 直说了,我使用的软件是vs,但是dev也可以运行,反倒是初次使用vs的同学,没有关掉sdl检查的话运 ...

最新文章

  1. office在线编辑器
  2. 多个网站tracert测试用的批处理
  3. 如何找到SAP ABAP odata服务实现的具体backend 系统
  4. ubuntu 14.04 LTS(64bit)源配置
  5. 结对开发2(求二维数组的最大子数组和)
  6. 解决PyScripter中文乱码问题
  7. ubuntu 常用软件
  8. cesium使用obj格式的3D模型
  9. 【天光学术】美术论文:湖南传统雕刻艺术的表现形式与特点(节选)
  10. 大于一千的最小质数c语言,c语言找出大于m的最小素数
  11. linux主目录下的文件夹改回英文
  12. Linux软件手动添加到桌面或启动栏
  13. 机械臂规划----三次样条曲线
  14. 前端Vue简单编写一个幸运大转盘抽奖游戏
  15. 【有利可图网】PS教程:把静态照片做成GIF放大动画效果
  16. 机器学习经典算法---线性回归(Linear Regression)算法
  17. linux系统编程之管道(三):命名管道FIFO和mkfifo函数
  18. LNK2019 unresolved external symbol __iob_func referenced in function _OPENSSL_stderr
  19. linux下文件的重命名方法
  20. C语言函数大全-- q 开头的函数

热门文章

  1. 异质性分析:系数平滑可变模型
  2. mysql约束表达式大全_SQL常用约束语句
  3. 使用Hbuilder打包前端网站为WebApp(Android,ios应用)
  4. matlab怎么将背景颜色换为白色,hypermesh将背景颜色设置为白色的方法
  5. Hadoop Shell 常用命令
  6. 贾俊平-第四章:数据的概括性度量
  7. 第一课:路由器宽带拨号入网(小米路由器)
  8. Markdown绘制流程图的方法
  9. 张钹院士:迈向第三代人工智能 思维导图
  10. Arcgis_ToolBox学习之一——Extract之Split