【问题标题】:Shortest path in "two-graph" with limited number of changes更改次数有限的“双图”中的最短路径
【发布时间】:2014-01-03 12:24:10
【问题描述】:

假设我们在一组顶点上有两个有向和正加权图(例如,第一个图代表铁路,第二个代表公交车道;顶点是公交车站或火车站或两者兼而有之)。我们需要找到从 A 到 B 的最短路径,但是我们不能改变传输类型超过 N 次。

我试图修改 Dijkstra 的算法,但它只适用于一些“不那么平均和复杂”的图表,我想我需要尝试一些不同的东西。

如何最好地表示“双图”以及如何管理遍历图时的有限更改?有没有可能在这个中调整 Dijkstra 的算法?任何想法和线索都会有所帮助。

编辑:好吧,我忘了一件事(我认为这很重要):N = 0,1,2,...;我们可以想出任何我们喜欢的图形表示,当然每两个节点之间最多可以存在 4 条边(一个方向有 1 条公交专用道和 1 条铁路,第二方向有 1 条公交专用道和 1 条铁路)。

【问题讨论】:

  • "digraph" 也是一个像 "ae" 的字母对,重新标记。
  • 两张图有什么关系? 它们是两个图吗?
  • 我认为修改 Dijkstra 没有任何问题。您只需向 Dijkstra 添加一个分支定界组件,从路径列表中永久删除那些超过允许更改数量的路径。
  • 或者一开始就不在后继函数中添加这样的邻居。
  • @arne 除非我遗漏了什么,否则没有明显的天真的方法可以修改 Dijkstra 以合理的时间复杂度。如果你真的有这样的修改,你介意简单描述一下吗?更详细的?

标签: c++ c dijkstra shortest-path directed-graph


【解决方案1】:

我认为这不是最好的方法,但您可以按如下方式创建节点:

Node:(NodeId, GraphId, correspondenceLeftCount)

(节点总数为number_of_initial_nodes * number_of_graphs * number_of_correspondences_allowed

所以:

对于GraphId 不变的边缘,correspondenceLeftCount 也不变。 您为对应添加一个新的边缘:

(NodeId, Graph1, correspondenceLeftCount) -> (NodeId, Graph2, concurrentLeftCount - 1)`

对于请求 A->B: 您的起点是 (A, graph1, maxCorrespondenceLeftCount)(A, graph2, maxCorrespondenceLeftCount)
你的终点是(B, graph1, 0), ... , (B, graph1, maxCorrespondenceLeftCount), (B, graph2, 0), ... , (B, graph2, maxCorrespondenceLeftCount)

因此,您可能必须针对 结束条件调整 Dijkstra 实现,并且能够插入多个起点。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2021-11-27
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多