【问题标题】:Shortest path to reach from source to destination by visiting a set of nodes通过访问一组节点从源到目的地的最短路径
【发布时间】:2020-06-03 10:21:11
【问题描述】:

鲍勃和爱丽丝联手参加了一个游戏节目。在赢得第一轮之后,他们现在可以进入一个隐藏着黄金的迷宫。如果 Bob 可以收集所有的金币并将它们交付给 Alice 的位置,他们就可以分割黄金。 Bob只要留在迷宫中,就可以水平或垂直移动,并且牢房没有被阻塞。 迷宫由 n x m 数组表示。每个单元格都有一个值,其中 0 是开放的,1 是阻塞的,2 是用金币开放的。 Bob 从 (row, column) = (0, 0) 中单元格的左上角开始。 Alice 的位置由 (x,y) 给出。确定 Bob 可以遵循的最短路径来收集所有金币并将它们交付给 Alice。如果 Bob 无法收集并提供所有金币,则返回 -1。

约束:-

1

0

1

1

谁能帮我想出一个算法?

【问题讨论】:

标签: algorithm matrix graph breadth-first-search maze


【解决方案1】:

半暴力算法在这里会很好,原因很简单,这个问题是 NP-Hard。

为了表明我们需要做一些简化。将迷宫转移到一个图中,从每个硬币到另一个硬币的路径是加权边,硬币是节点。
现在的问题是找到从 Bob 到所有节点的最短路径,而不是返回到 Alice,根据 Stack Overflow 中的this 问题,这是 NP-Hard。

由于这个原因,给定的约束是如此之低,所以它可以被暴力破解。

我有一个蛮力算法的想法:

  1. 多次使用 Dijkstra 算法查找所有硬币对的最短路径 - O(#coins * (E + V log V))

  2. 创建所有硬币的所有排列。 O(#coins!),其中! 表示阶乘符号。

对于每个排列:

对于排列中的每两个连续硬币:

  1. 找到两个硬币之间的最短路径(使用阶段 1)。 注意不要去你不小心已经拿到的硬币。

  2. (在循环之外)返回第 3 阶段的路径总和最短的排列。

时间复杂度为O(#coins! + #coins * (E + V log V))
这很多,但考虑到您的限制是可能的!

【讨论】:

  • 1.不明白为什么边缘应该被加权。 2. "找出每个硬币到下一个硬币的最短路径"你会如何确定硬币的顺序?
  • 1.应该对边进行加权,因为图中每个节点之间的路径在迷宫中不止一个节点(这部分不太重要,因为它只是为了表明问题是 NP-Hard)。 2. 硬币的排列顺序由排列顺序决定。
  • 我对其进行了编辑,使其更易于理解并降低了一点时间复杂度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多