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

Graph 打印无向加权图中2个节点之间的所有最小路径,graph,undirected-graph,weighted-graph,Graph,Undirected Graph,Weighted Graph,我已经知道如何在无向加权图中找到两个节点之间距离最小的路径。但是,如果有多条路径具有相同的最小距离,该怎么办?如何找到并打印所有这些路径?让我们同意,我们正在无向加权图G上寻找简单路径(无重复顶点) 两个顶点u和v之间的最小距离路径的数量最多可达(n-2)!(具有零权边的完整图,每个从u开始到v结束的置换都是有效的最小距离路径) 然而,如果您创建了一个新的图G',该图的顶点与G相同,并且其边属于G中u和v之间的某个最小距离路径,则可以计算出这些路径的数量,或者进行回溯以找到它们中的每一条 构建G

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

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

两个顶点u和v之间的最小距离路径的数量最多可达(n-2)!(具有零权边的完整图,每个从u开始到v结束的置换都是有效的最小距离路径)

然而,如果您创建了一个新的图G',该图的顶点与G相同,并且其边属于G中u和v之间的某个最小距离路径,则可以计算出这些路径的数量,或者进行回溯以找到它们中的每一条

构建G'的简单方法是:

  • 计算从u开始并保持距离数组(du)的单源最短路径
  • 计算从v开始并保持距离数组(dv)的单源最短路径
  • 使用G和零边的所有节点创建G'
  • 对于G中的每条边(的权重为w),如果du[x]+w+dv[y]==du[v]或du[y]+w+dv[x]==du[v],则属于G’
  • 如果在第4步强制边缘方向,并且没有零权重循环,则G'是DAG(有向无环图)。您可以使用DAG属性来计算G'中u和v之间的最小距离路径量,并作为sidequest证明,该答案等于原始问题的答案。同样,如果每次从u回溯到v,那么就得到了G中u和v之间的最小距离路径


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

    这将是什么时间复杂度?要构建G'(并使用dijkstra算法),运行时是O(ElogV+(E+V)),因为您对dijkstra O(ElogV)执行了两次调用,创建G'O(V)并迭代go(E)中的所有边。通常| V |小于或等于| E |,因此总运行时间是O(ElogV)。要计算DAG中u和V之间的最小距离路径量,使用的运行时间是O(V+E)(使用拓扑排序和动态规划来找到答案)回溯是O(n!),如前所述。