算法 – 找到通过某个任意序列节点的最短路径?

this earlier question年,OP询问如何从图中找到一个从u到v的最短路径,并通过某个节点w。接受的答案是相当好的,是运行Dijkstra算法两次 – 一次从u到w,一次从w到v,这具有等于Dijkstra算法的两次调用的时间复杂度,即O(mn log N)。

现在考虑一个相关的问题 – 你给出了一系列节点u1,u2,…,uk,并希望找到从u1到uk的最短路径,使得路径顺序通过u1,u2,…,uk 。显然,这可以通过运行Dijkstra算法的k-1个实例来完成,每个对相邻顶点一个,然后将最短路径连接在一起。这需要时间O(km k n log n)。或者,您可以使用约翰逊算法的全对最短路径算法来计算所有最短路径,然后将适当的最短路径连接在O(mn n2 log n)时间内,这对于比n大得多的k有好处。

我的问题是,当k很小时,是否存在一种解决这个问题的算法,比上述方法更快。这样的算法是否存在?还是迭代Dijkstra的一样好?

而不是运行Dijkstra算法的孤立实例来找到路径u(k)→> u(k 1)一个路径,可以同时在序列中的每个节点处启动修改的Dijkstra样搜索的单个实例,当搜索区域在“中间”满足时形成路径。

与对Dijkstra的算法进行一系列隔离的调用相比,这将潜在地减少访问的边的总数,并减少边的重新遍历。

一个简单的例子就是找到两个节点之间的路径。扩展两个节点的搜索区域,而不仅仅是扩展一个。在均匀图形的情况下,第二选项将给出半径等于节点之间的距离的搜索区域,第一选项将给出半径小于半径的整个搜索区域的两个区域。

只是一个想法。

编辑:我想我正在谈论一个bi-directional search的多方向变体,与序列{u(1),u(2),…,u(m)}中的节点一样多的方向。

http://stackoverflow.com/questions/7314718/finding-a-shortest-path-that-passes-through-some-arbitrary-sequence-of-nodes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:算法 – 找到通过某个任意序列节点的最短路径?