问题描述
我已经知道如何在无向加权图中的2个节点之间找到最小距离的路径。但是,如果有多个具有相同最小距离的路径怎么办?我如何找到并打印所有这些?
解决方法
我们同意,我们正在无向加权图G上寻找简单路径(没有重复的顶点)。
两个顶点 u 和 v 之间的最小距离路径的数量可能高达(n-2)! (权重边为零的完整图,从 u 开始到 v 结束的每个排列都是有效的最小距离路径。)
尽管如此,如果您设法创建一个新顶点G'并具有与G相同的顶点,并且其边缘是属于某个最小距离路径的那些顶点,则可以找出此类路径的数量或回溯以找到每个路径在G中 u 和 v 之间。
构建G'的简单方法是:
- 计算以 u 开头的单源最短路径,并保留距离数组(du)。
- 计算以 v 开头的单个源最短路径,并保留距离数组(dv)。
- 使用G到零边的所有节点创建G'。
- 对于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的算法根据您的体重限制来计算单个源最短路径。