博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
飞机换乘次数最少问题的两种解决方案
阅读量:4108 次
发布时间:2019-05-25

本文共 1110 字,大约阅读时间需要 3 分钟。

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

设有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源码下载:

转载地址:http://vkmsi.baihongyu.com/

你可能感兴趣的文章
ThreadLocal
查看>>
从Executor接口设计看设计模式之最少知识法则
查看>>
OKhttp之Call接口
查看>>
application/x-www-form-urlencoded、multipart/form-data、text/plain
查看>>
关于Content-Length
查看>>
WebRequest post读取源码
查看>>
使用TcpClient可避免HttpWebRequest的常见错误
查看>>
EntityFramework 学习之一 —— 模型概述与环境搭建 .
查看>>
C# 发HTTP请求
查看>>
初试visual studio2012的新型数据库LocalDB
查看>>
启动 LocalDB 和连接到 LocalDB
查看>>
Palindrome Number --回文整数
查看>>
Reverse Integer--反转整数
查看>>
Container With Most Water --装最多水的容器(重)
查看>>
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>
Generate Parentheses--生成匹配括号(重)
查看>>
Remove Element--原地移除重复元素
查看>>