寻找包含两个节点的最短循环

Posted

技术标签:

【中文标题】寻找包含两个节点的最短循环【英文标题】:Finding shortest cycles containing two nodes 【发布时间】:2013-05-03 11:50:07 【问题描述】:

令 G=(E,V) 是具有非负边成本的有向图。让 s 成为一个顶点。我需要找到一种算法,找到每个顶点v,即同时包含s和v的最短循环。循环可能多次包含相同的边。

显而易见的解决方案是从 s 运行 Dijkstra 以找到从 s 到每个 v 的最短路径。然后,从每个 v 再次运行 Dijkstra 以找到从 v 到 s 的最短路径。最短的周期是两者的结合。

这可行,但需要 O(|V||E| + |V|^2*log|V|)。有没有更好的解决方案?

【问题讨论】:

我认为这个问题更适合数学论坛。 是的,有一个解决方案可以运行 Dijkstra 两次。 math.stackexchange.com @MichelKeijzers 这是一个非常计算机科学的问题,它可能更适合Computer Science,但这些问题也适合Stack Overflow。它听起来不像Mathematics的问题,但我很可能是错的。 【参考方案1】:

对于有向图,您可以使用Floyd-Warshall Algorithm 查找所有两对之间的最短路径。

或者更有效的解决方案可能是在 反转图 上运行 Dijsktra(G'=(V,E') 使得对于 E 中的每个 (v,u)(u,v)E' 中),并连接两个解决方案(当然是相反的一个)。 这基本上是运行 Dijkstra 两次。

【讨论】:

以上是关于寻找包含两个节点的最短循环的主要内容,如果未能解决你的问题,请参考以下文章

两个节点之间最便宜和最短的路径

MATLAB教程案例79基于移动节点WSN的最短路由matlab仿真——应用于车组网或无人机组网等

图论之最短路径算法

SQL - postgres - 图中的最短路径 - 递归

图中的最短部分路径

neo4j寻找节点间的最短路径