BFS 最短路径与扭曲算法

BFS Shortest Path with a Twist Algorithm

设 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. 选择结果数最小的路径,然后return它。

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

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

非常感谢!

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

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

现在要找到第一类路径,我们可以简单地从具有特殊条件的节点 s 进行 BFS - 如果我们碰巧到达节点 k[=20=,我们就不能去任何地方]

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

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