【问题标题】:BFS Shortest Path with a Twist Algorithm带扭曲算法的 BFS 最短路径
【发布时间】:2021-12-18 17:25:11
【问题描述】:

令 G=(V,E) 为有向图。设 V 中的 s 为顶点。设 V 中的 k 是某个顶点,使得 k≠s。给定一条路径 p,将其成本定义为 p 中的边数。但是,如果路径经过顶点 k,则在访问过顶点 k 之后使用的每条边都计为 5。

对于 V 中的每个 v,用 c(s,v) 表示从 s 到 v 的最便宜路径的成本。建议一个有效的 用于计算 V 中的每个 v 的值 c(s,v) 的算法。

我也不能使用 Dijkstra 算法。

我最初的想法是使用单源最短路径算法。

这是我的尝试:

算法:

  1. 使用 BFS 计算从 s 到 v 的所有路径(未加权),并将路径存储在一个列表中。
  2. 遍历列表中的每个路径,如果 k 在路径中,则计算 k 之后的节点数(将其分配给变量 num),并将 4*num 添加到步骤 1 中已计算的总和。
  3. 选择结果数最小的路径,然后返回。

我认为我可以做得比这更好,因为在最坏的情况下,我们将有 |V|/2 条路径,所以时间复杂度可以是 O(n^2)。

我想听听一些改进任务的建议。

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    只有两种类型的路径——通过 k 的和不通过的:

    1. s --> ... --> v
    2. s --> ... --> k --> ... --> v

    现在要找到第一类路径,我们可以简单地从节点 s 执行 BFS,但有特殊条件 - 如果碰巧到达节点 k,我们将无法去任何地方

    对于其他路径,我们可以将它们分成两部分,s --> ... --> kk --> v,注意第一部分已经被第一个 BFS 知道。现在我们可以再次执行 BFS,这次是从节点 k

    现在任何v 的最短路径s --> v 只是min(type1PathCost[v], type1PathCost[k] + type2PathCost[v] * 5)

    【讨论】:

    • 听起来不错!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多