查找必须使用两个节点列表中的任意两个节点的最短路径



我实现了一个函数,该函数使用 Dijkstra 的算法在加权、无向图(正权重(中找到从给定源节点到任何给定目标节点的最短(最低权重(路径。

我有两个列表 A 和 B,每个列表至少包含一个节点位置,并且它们持有的每个节点都是有效的(在图中(。列表 A 中的节点也可以位于列表 B 中,反之亦然。

我需要扩展我的函数,以便它也将列表 A 和 B 作为输入,并找到从源节点到目标节点的最短路径,该路径至少使用 A 和 B 中的一个节点。此外,虽然它可以在路径中的任何点使用 A 和 B 节点,但它必须在使用 A 节点(或使用同时位于 A 和 B 中的节点(后使用 B 节点。

如果节点同时位于 A 和 B 中,则立即满足此要求。

源节点和目标节点都可以位于 A 和/或 B 中。

例如

有效路径(S 是源,D 是目标,N 是不在 A 或 B 中的节点(:

  • S> A> B> D
  • S> B>
  • A> B> D
  • S> N> B>
  • A> N> B> D
  • S> (A&B(> D
  • S(A(> D(B(

无效路径:

  • S> B> A> D

我如何能够扩展它,使其保持Dijkstra算法O(Elog(V((的复杂性?E 是边的 #,顶点的 V #。我认为一定有一种方法可以使用Dijkstra的算法恒定次数来做到这一点,因此复杂性不会改变。为任何帮助干杯。

我建议通过跟踪每个节点另外两个值来扩展Dijkstra。访问 A 的最短路径和访问 A>B 的最短路径(A 然后是 B(。

通常,您会跟踪到Dijkstra中每个节点的最短路径。现在,您将跟踪三个最短路径。您仍将处理单个步骤并将新邻居添加到队列中,但这一次,有三种可能性:

  1. 未访问 A 的到达节点:对于不在 A 中的所有邻居,更新暂定的">无 A"距离。对于 A 中的所有邻居,更新暂定的">与 A"距离。对于 A 和 B 中的所有相邻要素,更新暂定的">A>B"距离。

  2. 到达节点访问 A 但之后没有访问B:对于不在 B 中的所有邻居,更新暂定">与 A"距离。对于 B 中的所有邻居,更新暂定的">A>B"距离。

  3. 到达节点访问 A,然后访问 B如果最终节点,则找到结果。否则,更新所有邻居暂定">A>B"距离。

始终选择具有最小暂定距离的节点,就像在原始算法中一样。为此,您到达节点的条件并不重要。

相关内容

最新更新