【问题标题】:Does there exist a shortest path which goes through a group of vertices U是否存在通过一组顶点 U 的最短路径
【发布时间】:2019-07-23 15:45:37
【问题描述】:

问题是在有向图中找到两个顶点之间的最短路径 将进入顶点(U 中的 U)的边转换为两条边,并将进入非 u 顶点的边转换为 3 条边,从而有效地使通过 u 顶点的路径比非 u 顶点短。如果存在一条经过 U 中所有 u 的等长最短路径。

想法是然后运行一次 BFS 算法并检查最短路径是否包含 u 中的所有边,并且是否与 s 和 t 之间的最短路径长度相等(考虑所有相乘的边)。

编辑:抱歉,忘了问这个问题,这个算法正确吗?

【问题讨论】:

  • 那么,你的问题是什么?
  • 我没有看到问号,而只是想法/概念。你知道它的方法吗?
  • 我修复了帖子
  • 我不完全理解你的想法,但它似乎并不正确。通过从根本上调整边缘权重,您可以使路径更有可能通过 U,但不能保证。
  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议遵循帮助文档中的发布指南。 On topichow to ask 和 ...the perfect question 在此处申请。

标签: algorithm graph-theory shortest-path breadth-first-search


【解决方案1】:

你的算法的想法是可行的。也就是说,您运行 BFS 以找到最短路径,然后在更改后的图上再次运行 BFS,这使得通过 U 变得更好。但是您描述的更改它的方式可能会改变最佳路径。

这就是问题所在。假设 P1 是一条经过所有 U 的步数较多的最佳路径,而 P2 是一条从 U 到 U 经过昂贵的一跳的好路径,在更改之前 P1 可能比 P2 更好,但是在您更改权重之后,P2比P1好。所以你第二次找到 P2,它并没有遍历整个 U,你错误地得出 P1 不存在的结论。

要修复它,您必须为进入/离开 U 设置一个固定的奖励。所有边权重的变化相同。现在,一条路径经过的 U 的节点越多越好,但是您没有改变经过相同数量的 U 节点的两条路径的相对值。现在您的推理没有问题了。

【讨论】:

  • 你说得对,我问这个问题是因为这是一个我认为我回答正确但讲师决定给它评分 2/20 分的测试问题,在测试中我确实提到了恢复路径的长度(这非常重要),但我在这篇文章中忘记这样做了。
【解决方案2】:

在这里,自从发布问题以来,我已经设法证明了算法。

证明:

如果存在最短路径 P1,P2,P3...Pn 则在通过将进入非 U 顶点的边乘以 3 并将进入 U 顶点的边乘以 2 来扩充图形之后(我后来意识到扩充可以是 2 和1) 最短路径的长度为:
3 * |圆周率| - |{你|你在 Pi}|

路径中的边数乘以 3 减去路径中 U 中的顶点数。

显然,现在最短路径是最小化 3 * |Pi| 的路径。 - |{你|你在 Pi}|

但是 3*|Pi|是所有最短路径的常数,所以我们实际上想要最大化 |{u |你在 Pi}|

这意味着我们要通过 u 中尽可能多的顶点,所以如果通过使用 BFS 并恢复最短路径,我们发现它不包含 U 中的所有顶点,我们当然可以说这样的路径不存在,如果我们确实发现有一条路径穿过 U 中的所有顶点,我们必须检查它的长度(在将其恢复为原始图中的路径之后)我们可以简单地检查它的长度是否是 a s 和 t 之间的最短路径如果是,那么它是一条通过 U 中所有顶点的路径并且是最短路径,如果不是那么显然不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多