【问题标题】:Shortest path with a maximum number of vertices具有最大顶点数的最短路径
【发布时间】:2015-10-27 03:57:48
【问题描述】:

我想通过附加约束找到两个顶点之间的最短路径:最多可以访问 n 个顶点。该图是有向的、连通的、非负权重的,并且可能包含循环。

例子:

  1. n = 2 的最短路径 0->218
  2. n = 3 的最短路径 0->322
  3. n = 4 的最短路径 0->39

到目前为止,我已经实现了 Djikstras 算法来获得简单的最短路径,我的想法是保留当前访问的顶点的计数器,如果它超过 n 则需要退一步或多步并尝试使用另一条路径.. 但据我所知,Djikstras 不能用于回溯,如 here 所述。

另一个想法是以某种方式将每个节点之间的每个路径存储在一个表中。但我不太确定 Djikstra 如何发现权重为 18 的路径 0->2,因为它并不是真正的最短路径...

有人知道如何解决这个问题吗?

【问题讨论】:

  • 如何计算像你提到的那样访问了多少个顶点,而不是回溯将其作为权重的一部分?每走一步,重量都应该增加。不过,您必须以某种方式对其进行规范化。

标签: java algorithm graph graph-theory graph-algorithm


【解决方案1】:

将每个顶点划分为n顶点,即对于顶点u,我们创建n顶点表示为(u, 1) ... (u, n),第二个数字表示到这个顶点的步数。对于从 u 到 v 的每条边,我们创建一条从 (u, i) 到 (v, i+1) 的边,其中 1<=i<=n-1 在新图中。现在如果你想用n计算u和v之间的最短路径,只需从(u, 1)做Dijkstra,那么你的答案是min(result (v, i) | 1<=i<=n)

顶点总数可以是n*n,所以复杂度约为O(n^2*log(n^2))

【讨论】:

    【解决方案2】:

    令 COST_TO(v,n) 为具有 n 条边或更少边的顶点 v 的最小路径的总权重。

    当 n=0 时,答案很简单:

    对于所有 v,如果 v 是源顶点,则 COST_T(v,0) = 0,否则为无穷大

    对于 n>0,COST_TO(v,n) 是 COST_TO(v,n-1) 和所有 COST_TO(w,n-1)+WEIGHT(w,v) 的最小值,其中有一条边来自w到v

    因此,对于 n = 0 到 N,跟踪 COST_(v,n)

    同时,您可以跟踪到每个 v 的最小权重路径——每次使用边规则更新 v 的成本时,到 v 的新路径是到 w 的路径加上该边。反向单链表很方便。

    【讨论】:

      【解决方案3】:

      假设您要找到从源顶点S 到目标顶点T 的最短路径,其中最多包含K 边。我选择了K,因为您问题中的n 具有误导性——如果您想找到最多访问n 顶点的最短路径,其中n 是顶点总数,您可以运行Dijkstra,因为任何简单的路径最多有 n 顶点 - 我认为这不是你想要的。

      那么,如果你想要一个简单的实现,Bellman-Ford 在这里是个不错的选择:

      在外部循环的i-th 迭代之后,算法计算了从源顶点S 到由at most i edges 组成的任何其他顶点的最短路径,因此它由at most i + 1 vertices 组成。所以为了解决你的问题,运行K - 1 Bellman-Ford 的外部循环,并检查到目标顶点T 的距离是否定义明确(与无穷大不同),如果是,你有你的结果.否则,在访问K 或更少的顶点时,T 无法从S 到达。

      【讨论】:

      • 我认为该算法不一定有效。链接的 Wikipedia 页面也这么说:“在每次迭代 i 扫描边缘时,算法会找到最长为 i 边缘的所有最短路径(可能还有一些比 i 边缘长的路径)。”如果您需要在 $i$ 边缘处进行硬约束,这可能会给出错误的答案。
      【解决方案4】:

      也许尝试一个 bfs 并检查顶点数与最大值。保存满足约束条件中最好的。

      这是一个关于它的视频 https://youtu.be/TvHV3PB8ANs

      Nist.gov 也有一些算法。

      【讨论】:

      • 视频已被删除。你还记得原来的标题吗?或者有一个指向另一个算法演示的指针?
      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 2023-04-11
      • 2019-05-05
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多