如果我知道给定的图形实际上是生成树,即每对顶点之间只有一条路径,我怎样才能找到从每个顶点到每个顶点的最短路径? 我想要最优的解决方案。我知道Dijkstra的算法,但它的时间非常复杂。
我基本上想知道距离&来自一个源的每个顶点的路径。鉴于它是生成树,最佳和最佳解决方案是什么?
另外,请告诉我,如果图形实际上是生成树,那么找到所有对最短路径的方法比单独应用单源最短路径算法的情况要多一些。
请注意,过分解释。
答案 0 :(得分:3)
执行此操作的正确方法是从某个任意节点 N 开始深度优先搜索,您可以在线性时间内执行此操作。每次遇到新节点时,都会记录您到达那里的路径。这将为您提供 N 与图中每个其他节点之间的最短路径。
要查找节点 V 和 W 之间的最短路径,请查看从 V 到 N ,以及从 N 到 W 的路径。这将为您提供 V 和 W 之间的最短路径,除了可能是您点击 N 的中间的冗余位然后返回再次。例如,假设从 V 到 N 的路径是这样的:
V, A, B, C, D, E, N
从 N 到 W 的路径是这样的:
N, E, D, F, G, W
然后您可以看到在连接这些之后 V 到 W 的路径将到达 D ,然后转到< em> N 通过 E 然后再返回。这需要从您的路径中删除,以便为您提供最短路径。换句话说,您从第一个路径的末尾向后扫描,然后通过第二个路径向前扫描,直到到达它们共有的最后一个节点(在这种情况下为 D )并且您将其切断路径并在此处将它们连接在一起,以便您
离开V, A, B, C, D, F, G, W
这将为您提供最短的路径。您可以看到这一点,因为从 V 到 W 的任何不重复任何节点的路径必须是生成树中的最短路径。
这是一个以维基百科为例的生成树。如果您将 V 作为左上角, N 作为右上角, W 作为左下角,您可以看到来自 V 到 W 是从 V 到 N 的最短路径,与来自 N的最短路径连接到 W ,但没有中间的重复部分,我们来到 N 并返回主路径。
答案 1 :(得分:2)
最佳解决方案:
选择一个任意顶点作为根并从中运行深度优先搜索以计算所有dist[i]
的{{1}} - 根与i
之间的距离顶点。
两个任意顶点i
和u
之间的距离为v
,其中dist[u] + dist[v] - 2 * dist[lca(u, v)]
是lca(u, v)
和{{u
的最低共同顶点1}}。
第一步有v
时间复杂度。第二步的时间复杂度取决于最低共同祖先搜索实现。每个查询可以使用线性预处理时间来实现O(n)
(使用此算法:http://www3.cs.stonybrook.edu/~bender/newpub/BenderFa00-lca.pdf),但这种方法有一个相当大的常量,并且实现起来并不容易。此解决方案是最佳的,因为它需要O(1)
时间进行预处理(由于您必须至少读取输入,因此无法做得更好)并且它会在恒定时间内回答查询。
使用更简单的算法,您还可以使用O(n)
或O(log n)
预处理时间为每个查询获得O(n)
次。