【问题标题】:Find the shortest path in an graph containing at least one green edge在至少包含一条绿色边的图中找到最短路径
【发布时间】:2014-04-02 19:52:32
【问题描述】:

我需要找到一种算法来在无向图 G1 中以随机方式找到从 v_s 到 v_t 的最短路径,并且我必须通过至少一个绿色边。

我的解决方案(不确定最好的解决方案):

  1. 将图形 G1 复制到 G2
  2. 在 G1 中断开所有边到 v_t
  3. 为同一节点添加连接到 G1 到 G2 中绿色边的所有节点的边。
    例如,如果我们在 G1 中有一个带有节点 (v1,u1) 的绿色边缘
    我们将一个节点从 v1 添加到 u2
  4. 我运行 BFS 来查找从 v_s 到 v_t 的最短路径(将在 G2 中)。
    通过这样做,我迫使 BFS 通过绿色边缘到达 v_t

【问题讨论】:

  • 这听起来是个不错的解决方案。您的具体问题是什么?
  • A* 搜索在最坏的情况下会演变为 BFS,但还有一个优点是您可以包含一个启发式算法来合并解决方案需要绿色边缘的约束。

标签: algorithm graph


【解决方案1】:

您的解决方案很棒,但我会使用 Dijstra 的算法而不是 BFS。它通常效率更高,但这取决于数据,因为在最坏的情况下它可以搜索尽可能多的 BFS,但需要支付优先级队列的额外开销。

另一个不错的解决方案,是对本杰明解决方案的修正

  1. 运行 Dijstras 的 single-source-shortest-path 两次,一次来自源,一次来自目标

  2. 穿过所有绿色边缘。对于每个,将来自源的路径和来自目标的路径相加。 选择其中最短的。

这个解决方案对我来说比你的更直观,但我看不出其中一个比另一个有真正的优势。

【讨论】:

    【解决方案2】:

    我的方法是运行双向 Dijkstra 搜索,然后当至少一个分支包含绿色边缘时,只允许每个搜索的一个分支相遇。

    这类似于您自己的方法,但不需要将图形复制到 G2 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 2019-10-20
      • 2011-07-19
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多