本文共 1110 字,大约阅读时间需要 3 分钟。
设有n个城市,编号为0~n-1;
有m条航线,以起点和终点标记。 要求当用户从键盘输入始发城市和目的城市编号后,程序可以在屏幕上显示一个换乘次数最少的乘机方案。首先,航线地图即全部航线的记录选择的数据结构是图,当然也可以采用其他可以记录类似于起点->终点这种信息的其他结构,这里我们就用图好了。
其次,图的描述采用邻接矩阵,仅仅是为了算法思想的代码实现更加方便,而不考虑其他方面的因素。对图从起点开始进行广度优先遍历,当遇到目的地时就意味着最少换乘方案的形成。
这是因为:对图进行层次遍历时每深入一层,意味着换乘次数加一,所以当遍历到目的地时自然是换乘次数最少的方案。 这种方案有如下问题要解决:解决方案是:
1、将节点的结构设置为:该节点本身信息的载体C(比如在矩阵中的下标)+指向使它进入队列的节点的指针B。当求解问题时使用B指针来记录一种引入与被引入的关系。这样,一旦找到目的地,我们就可以“顺藤摸瓜”找到一条路径,而这“藤”的尽头就是路径的起点,它的B指针是NULL,因为没有节点引它入队列。这要求我们在访问完一个节点后,在将它的邻接点放入队列前设置后这些关系。即:访问->设置引入关系->入队列;出队列->访问->设置引入关系->入队列;直到找到目的地D,然后通过B指针找到引入D的节点D1,之后一直进行,直到Dx的B指针为NULL,形成路径;或者结束广度遍历,没有合适的路线。 2、因为不知道如何存储,所以就不存储路径信息,转而记录引入关系。同样,我们还是要解决路径的记录问题。解决方法实际上还是采用反向追朔的方法。书上采用的方法是设置了长度为n的数组path,如果在路径上节点i的前驱是节点j,那么path[i]=j,这里的i和j都是矩阵中用来标记节点的int类型值。相比采用重新设置节点结构的方法,这种方法对于已有代码:原来表示节点的结构或者类的代码以及构造函数中用来初始化节点信息的代码的影响要小的多,因为只需要增加并且初始化一个数组而已。改变节点结构的方法虽然达到相同的目的,但是涉及的改动太多,即引入的“变化”太多。不是很理想的方法。
CSDN源码下载:
转载地址:http://vkmsi.baihongyu.com/