飞机换乘次数最少问题的两种解决方案

飞机换乘次数最少的问题描述如下:

设有n个城市,编号为0~n-1;
有m条航线,以起点和终点标记。
要求当用户从键盘输入始发城市和目的城市编号后,程序可以在屏幕上显示一个换乘次数最少的乘机方案。

问题分析:

首先,航线地图即全部航线的记录选择的数据结构是图,当然也可以采用其他可以记录类似于起点->终点这种信息的其他结构,这里我们就用图好了。
其次,图的描述采用邻接矩阵,仅仅是为了算法思想的代码实现更加方便,而不考虑其他方面的因素。

飞机换乘问题主要的两种解决方案:

  • 一、采用广度优先遍历图的方式:

对图从起点开始进行广度优先遍历,当遇到目的地时就意味着最少换乘方案的形成。
这是因为:对图进行层次遍历时每深入一层,意味着换乘次数加一,所以当遍历到目的地时自然是换乘次数最少的方案。
这种方案有如下问题要解决:

  • 如何记录路径信息?对于待访问节点队列(为进行广度优先遍历而使用队列来存储已访问节点的后继节点)中的点,如何得到它的前驱?
  • 如何处理已经访问过的节点?它们有可能是所求路径的一部分,有可能不是所求路径的一部分,而在访问它们时我们无法判断它们是不是路径中的点。

解决方案是:
1、将节点的结构设置为:该节点本身信息的载体C(比如在矩阵中的下标)+指向使它进入队列的节点的指针B。当求解问题时使用B指针来记录一种引入与被引入的关系。这样,一旦找到目的地,我们就可以“顺藤摸瓜”找到一条路径,而这“藤”的尽头就是路径的起点,它的B指针是NULL,因为没有节点引它入队列。这要求我们在访问完一个节点后,在将它的邻接点放入队列前设置后这些关系。即:访问->设置引入关系->入队列;出队列->访问->设置引入关系->入队列;直到找到目的地D,然后通过B指针找到引入D的节点D1,之后一直进行,直到Dx的B指针为NULL,形成路径;或者结束广度遍历,没有合适的路线。
2、因为不知道如何存储,所以就不存储路径信息,转而记录引入关系。

  • 二、采用DijKstra算法——将所有边的权都设置为1,进行求解。

同样,我们还是要解决路径的记录问题。解决方法实际上还是采用反向追朔的方法。书上采用的方法是设置了长度为n的数组path,如果在路径上节点i的前驱是节点j,那么path[i]=j,这里的i和j都是矩阵中用来标记节点的int类型值。相比采用重新设置节点结构的方法,这种方法对于已有代码:原来表示节点的结构或者类的代码以及构造函数中用来初始化节点信息的代码的影响要小的多,因为只需要增加并且初始化一个数组而已。改变节点结构的方法虽然达到相同的目的,但是涉及的改动太多,即引入的“变化”太多。不是很理想的方法。

CSDN源码下载:飞机换乘次数最少问题解决方案C++完整代码

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值