寻找包含两个节点的最短循环
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 两次。
【讨论】:
以上是关于寻找包含两个节点的最短循环的主要内容,如果未能解决你的问题,请参考以下文章