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

问题描述

我已经知道如何在无向加权图中的2个节点之间找到最小距离的路径。但是,如果有多个具有相同最小距离的路径怎么办?我如何找到并打印所有这些?

解决方法

我们同意,我们正在无向加权图G上寻找简单路径(没有重复的顶点)。

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

尽管如此,如果您设法创建一个新顶点G'并具有与G相同的顶点,并且其边缘是属于某个最小距离路径的那些顶点,则可以找出此类路径的数量或回溯以找到每个路径在G中 u v 之间。

构建G'的简单方法是:

  1. 计算以 u 开头的单源最短路径,并保留距离数组(du)。
  2. 计算以 v 开头的单个源最短路径,并保留距离数组(dv)。
  3. 使用G到零边的所有节点创建G'。
  4. 对于G中的每个边 x y >( x y >的权重为 w ),如果du [x] + w + dv [y] == du [v]或du [y] + w + dv [x] == du [v],则属于G'。

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

您可以使用dijkstra的算法或Bellman-Ford的算法根据您的体重限制来计算单个源最短路径。