我需要一个有向循环图中从一个节点到所有节点的最短路径的示例(它应该从一个作为输入的节点到达图的所有节点)。
如果有示例,请提供C++代码或算法。
我需要一个有向循环图中从一个节点到所有节点的最短路径的示例(它应该从一个作为输入的节点到达图的所有节点)。
如果有示例,请提供C++代码或算法。
编辑:糟糕,我误读了问题。感谢@jfclavette指出。旧答案在结尾处。
你试图解决的问题被称为旅行商问题。有许多潜在的解决方案, 但它是NP完全问题,因此你无法解决大型图形的问题。
旧答案:
你要找到的是图形的周长。可以通过将节点到自身的距离设置为无限远,并使用Floyd-Warshall算法来解决。然后从节点i开始的最短循环的长度就是ii位置的条目。
伪代码中:
//INPUT: graph G = (V,E)
//OUTPUT: shortest cycle length
min_cycle(G)
min = ∞
for u in V
len = dij_cyc(G,u)
if min > len
min = len
return min
//INPUT: graph G and vertex s
//OUTPUT: minimum distance back to s
dij_cyc(G,s)
for u in V
dist(u) = ∞
//makequeue returns a priority queue of all V
H = makequeue(V) //using dist-values as keys with s First In
while !H.empty?
u = deletemin(H)
for all edges (u,v) in E
if dist(v) > dist(u) + l(u,v) then
dist(v) = dist(u) + l(u,v)
decreasekey(H,v)
return dist(s)
要返回最短循环的实际路径,只需要进行轻微修改即可。
对于非加权图,BFS可以胜任。由于您的图中存在潜在的循环,因此您需要跟踪已访问的节点(无论如何,您都需要为BFS执行此操作)。
对于加权图,可以使用Bellman-Ford算法。它也能够检测到循环。