Algorithm 算法:查找具有列车换乘限制的城镇之间的连接

Algorithm 算法:查找具有列车换乘限制的城镇之间的连接,algorithm,graph-algorithm,Algorithm,Graph Algorithm,您将使用什么算法创建一个应用程序,在给定适当数据(城市列表、火车路线、火车站)的情况下,该应用程序能够返回任意两个用户选择的城市之间的连接列表?应用程序必须仅选择那些符合可接受列车变更限制的连接 示例:我询问应用程序,如果我需要从巴黎到莫斯科的行程最多有1个站点/道岔,我将乘坐哪趟列车-应用程序返回一条路线:1号列车(巴黎-柏林)->2号列车(柏林->莫斯科)(不存在直接连接) 图形示例 如果我向系统询问从城镇A到城镇G的可能连接,我会得到答复: 棕色线路(0个开关=直接) 棕色线路至城镇B

您将使用什么算法创建一个应用程序,在给定适当数据(城市列表、火车路线、火车站)的情况下,该应用程序能够返回任意两个用户选择的城市之间的连接列表?应用程序必须仅选择那些符合可接受列车变更限制的连接

示例:我询问应用程序,如果我需要从巴黎到莫斯科的行程最多有1个站点/道岔,我将乘坐哪趟列车-应用程序返回一条路线:1号列车(巴黎-柏林)->2号列车(柏林->莫斯科)(不存在直接连接)

图形示例

如果我向系统询问从城镇A城镇G的可能连接,我会得到答复:

  • 棕色线路(0个开关=直接)
  • 棕色线路至城镇B/橙色线路至城镇G(1个开关)
  • 棕色线至城镇B/橙色线至城镇D/红色线至G(2个开关)
  • 。。。所有其他可能性

虽然第二个和第三个选项比第一个选项短,但应该优先考虑第一个选项(因为不涉及列车换乘)。

假设唯一重要的是“停车/换乘次数”,那么问题实际上是在未加权的情况下找到最短路径

图形模型为
G=(V,E)
其中
V={所有可能的车站}
E={(u,V)|有一列从u站到V站的列车/路线}

注意:假设你有一列火车从a_0开始,经过a_1,a_2,…a_n:E将包含:
(a_0,a_1),(a_0,a_2),…(a_0,a_n)
(a_1,a_2),
(a_1,a_3),…
形式上:对于每个
i
(a_i,a_j)
;E

解决了这个问题,并且是[总是找到解决方案,如果有]和[找到最短路径]

如果对边[路线]进行加权,则需要类似的内容


如果需要所有可能路径的列表,可以使用,而无需维护访问集,并将找到的所有路径打印到相关深度的目标。[BFS无法返回所有路径和一个团的反例]

我认为您需要计算所有对最短路径。检查

@Queequeg答案仍然成立。给定源城市s和目标城市t,从s运行BFS。BFS找到的路径是最短的,因此需要的交换机比任何其他路径都少
但BFS会将每个城市/节点计算为一个交换机,这是不正确的-即BFS不会选择棕色线路,但它是最佳的solution@Queequeg当前位置我理解你的困惑所在。我更新了答案[参见粗体注释],将选择棕色线,因为您将添加一条从
townA
townG
的直接边,因此BFS找到的最短路径是
(townA,townG)
——这是没有开关的路径,正如预期的那样。我明白了。好主意!但是内存开销会很大,不是吗?@Queequeg:传统上,对于图,
|E |=O(| V | ^2)
,边的数量最多是顶点数量的二次方。这种情况并没有什么不同——因为在“最坏情况”下,你有一列火车从每个源头穿过所有车站,所以
E=vxv
[你有一个小集团!],你得到
|E |=O(| V | ^2)
。对于这种特殊情况,您得到的是
| E |=O(| V |*最长的列车路径)
,比
O(| V | ^2)