C语言与程序设计第18章程序设计开发实例.ppt

C语言与程序设计第18章程序设计开发实例.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
华中科技大学计算机学院C语言课程组 C语言与程序设计 The C Programming Language 内容提纲 1 问题描述 2 问题分析 问题的数学模型 最短路径算法 3 设计思路 用动态数组代替链表 线路序号和线路编号 线路名和站名的存储 查找表设计 邻接矩阵的生成 队列的入队和出队操作 最短路径的标记和输出 18.1 问题描述 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名由文件stations.txt给出。 线1:苹果园,…,四惠东 线2:西直门,车公庄,…,建国门 线4:… …… 文件stations.txt中,每一行数据表示一条地铁线路,包括地铁线路名称和线路上每个站点名称。地铁线路名称在行首,用半角冒号“:”与后面的地铁站点名称分隔,地铁站按邻接次序依次排列,站名之间用逗号分隔。如果多条地铁线拥有同一个站名,表明这些地铁线间可以在该站换乘。 18.1 问题描述(续) 为引导旅客合理利用线路资源,解决交通瓶颈问题,该市制定了票价策略: ① 每条线路可以单独购票,票价不等。 ② 允许购买某些两条可换乘线路的联票,联票价格低于分别购票的价格和。 单线票价和联合票价由文件price.txt给出,形式如下: 线1 180 …… 线13 114 线1,线2 350 线1,线10 390 …… 文件price.txt中,每行数据表示一条单线或联线的票价。线名与票价间用空格分开。如果是联线,两线名之间用逗号分开,并且规定联线只能包含两条可换乘的线路。 18.1 问题描述(续) 现在的问题是,根据这些已知的数据,计算从A站到B站最小花费和可行的换乘方案。比如,对于本题目给出的示例数据,如果用户输入: 五棵松,奥体中心 程序应该输出:-(线1,线10)-线8 = 565 如果用户输入:五棵松,霍营 程序应该输出:-线1-(线4,线13) = 440 可以看出,用户输入的数据是:起始站,终到站,用逗号分开。程序输出了购票方案,在括号中的表示联票。短横线(-)用来分开乘车次序。等号后输出的是该方案下票价的总和。 18.2 问题分析 题目要求找到最小费用的乘车方案,并输出按此方案乘车所经过的线路(单线或联线)以及票价总和。我们会很自然地想到,用图来表示地铁线路的连接关系,图的每个顶点表示一条地铁线路,图的每条边表示两个顶点对应地铁线路直接相连(即有相同的地铁站,称为换乘站)。两条地铁线之间的换乘站可能有多个,由于不影响换乘方案和票价,所以对于有多个换乘站的两条地铁线对应的顶点,我们只需用一条边来连接。这样,问题被抽象为图的顶点间通路搜索问题。 18.2.1 问题的数学模型(续) 图18.1 从一个顶点集到另一个顶点集之间的最小费用问题 从地铁线A和G的换乘站出发,到地铁线D和E的换乘站(即从顶点集S1到顶点集S2)的最小费用问题 18.2.1 问题的数学模型(续) 通过增加虚拟顶点,对通路作等价转换,通路图变复杂了,但问题求解方法变简单了。 18.2.1 问题的数学模型(续) 增加虚拟顶点AG、BI、DE及虚拟起点S和终点T,从顶点S到顶点T的最短路径,等价于图18.1中从顶点集S1到顶点集S2的最小费用。 18.2.2 最短路径算法 在最短路径问题中,给出的是一有向加权图G=(V,E),在其上定义的加权函数W: E→R为从边到实型权值的映射。路径P=(v0, v1,…, vk)的权是指其组成边的所有权值之和: 定义u到v间最短路径的权为: 从结点u到结点v的最短路径定义为权的任何路径。 边的权常被解释为一种度量方法,而不仅仅是距离。它们常常被用来表示时间、费用、重量或任何其他沿路径线性积累的数量形式。 最短路径算法SPFA SPFA算法用数组d记录每个顶点与源点的最短路径估计值,用邻接表来存储图G。SPFA算法采取动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首顶点u,并且用顶点u当前的最短路径估计值d[u]对离开u点所指向的顶点v进行松弛操作,如果v点的最短路径估计值d[v]有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出顶点来对其他顶点进行松弛操作,直至队列变空为止。 所谓用u对v进行松弛,就是判定d[v]d[u]+w[u,v] 是否成立(w[u,v]是从点u到点v的边的权值),如果该式成立则将d[v]减小到d[u]+w[u,v],否则不变。换言之,每次的优化将会有某个点v的最短路径估计值d[v]变小。如果队列中的点都不能对其他点进行松弛,队列中的点将只出不进,最后队列变空,算法结束,此时数组d中的值即为从源点到其他各顶点的最

文档评论(0)

autohhh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档