计算中间必须要点的两个节点之间的最短路径

时间:2018-11-18 03:20:26

标签: java algorithm search shortest-path dijkstra

我正尝试在表示城市服务的按区域加权图中解决问题,该图具有约300个节点和700个边缘。

节点是由地铁站定义的,边缘是字符串,其中包含它们所属的线的信息以及在该边缘中行进的时间(边缘的权重)。

我必须确定两个站点之间的最快路径,并给出 unordered 的列表(如果命令了它们,则所有站点之间的最短路径排列就足够了)强制站点,它可以还要经过其他车站

搜索了此问题之后,我看到了一些创建子图+应用DFS的建议。因此,我创建了一个图,其中以起点桩号+强制桩号+终点桩号为新顶点,并以带有每个桩号之间的最短路径信息+行驶时间的信息作为边缘。

我现在遇到的问题是:我如何在这个新的子图上应用DFS,以使上次访问的站强制成为我作为目的地的站?

很抱歉,这个问题很久!

2 个答案:

答案 0 :(得分:0)

首先需要为您的问题定义一些内容:强制性站点是您仅需要访问 站点才能到达目的地的站点吗?还是在它们之间是否有其他未知站不是强制性的,而是可能需要在最短路径中进行?

假设此图包含循环:

如果强制性站点列表是到达目的地所需的所有站点,则可以在所有强制性节点的子图上使用Dijkstra算法解决此问题。

在另一种情况下,它将更加复杂(实际上是NP困难的),请参见以下答案以获取更深入的解决方案:Shortest path that traverses a list of required edges

答案 1 :(得分:0)

我有另一个主意。由于该图是非循环图,因此我们可以将必需节点(源节点和目标节点除外)分为两个节点( A A start ), A end )并在它们之间设置一条边,并将权重设置为-infinity。强制节点 A 的所有传入边缘都将连接到 A start ,强制节点 A 的所有传出边缘都将连接从 A end 中出来。最后,我们将为源节点到目标节点运行dijkstra算法。由于我们在必选节点中设置了-infinite权重,因此dijkstra必须通过它们以使成本最小化。另外,由于该图是非循环图,因此我们不必担心负循环。

enter image description here