打印无向加权图中2个节点之间的所有最小路径

Print all minimum paths between 2 nodes in an undirected weighted graph

给定一个无向加权图,2个节点之间的长度是整数。

如何打印图中具有最小距离对节点。如果有多对,则全部打印出来

假设我们正在无向加权图 G 上寻找简单路径(无重复顶点)。

两个顶点uv之间的最小距离路径数量最多可达(n-2)条! (具有零权重边的完整图,从 u 开始并在 v 结束的每个排列都是有效的最小距离路径)。

尽管如此,如果您设法创建一个新图 G',它具有与 G 相同的顶点并且其边属于某个最小值,则您可以计算出此类路径的数量或回溯以找到每条路径G.

uv 之间的距离路径

构建 G' 的简单方法是:

  1. 计算从u开始的单源最短路径并保持距离数组(du)。
  2. 计算从 v 开始的单源最短路径并保持距离数组 (dv)。
  3. 使用来自 G 的所有节点和零条边创建 G'。
  4. 对于 G 中的每条边 <xy>(<x 的权重, y> 是 w), 如果 du[x] + w + dv[y] == du[v] 或 du[y] + w + dv[x] == du[v] 那么 属于 G'.

如果您在第 4 步强制边缘方向并且没有零权重循环,则 G' 是 DAG(有向无环图)。您可以使用 DAG 属性 来计算 G' 中 uv 之间的最小距离路径的数量,并且作为 sidequest 证明这样的答案是等于原问题的答案。此外,如果从 u 回溯,只要它找到 v 那么你就会获得 u 和之间的最小距离路径v 中 G.

您可以使用dijkstra算法或Bellman-Ford算法根据您的权重约束计算单源最短路径。