作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个有向图,看起来像这样:
我想从 中找到最便宜的路径开始到结束 其中橙色虚线都是路径有效所必需的。
自然最短路径是:开始 -> A -> B -> 结束 结果成本 = 5,但我们还没有满足所有必需的边缘访问。
我想找到的路径(通过通用解决方案)是 开始 -> A -> B -> C -> D -> B -> 结束 其中成本 = 7,我们已经满足了所有必需的边缘访问。
有没有人对如何要求这样的边缘遍历有任何想法?
最佳答案
令 R 为所需边的集合,且 F = |R|。令 G 为输入图,t (resp. s) 是所请求路径的起点(相应的结束点)。
预处理:一堆Dijkstra的算法运行......
第一步是创建另一个图形。该图将恰好有 F+2 个顶点:
K
←
[]
,
L[0..R+1]
←
[]
和
U
← V(其中 V 是工作图中每个顶点的集合减去开始和结束顶点 t 和 s)。最后让
l
←
i
← 0 和
best_path_length
← ∞ 和
best_path
←
[]
i
≥ 0):
U
≠ []
c
← U.popFront()
(我们拿U头)L[i].pushBack(c)
i == R+1
AND ( l
== 重量( cur_path.back()
, s) + l
) < best_path_length
:best_path_length
← l
cur_path
K.tail()
之间有边e和 c
, 和 weight(e)
+ l
< best_path_length
:(如果K
为空,则将K.tail()
替换为上一条语句中的t)K.pushBack(c)
i
← i
+1 l
← weight(e)
+ l
cur_path.pushBack(c)
L[i]
末U
L[i]
← []
i
← i
-1 cur_path.popBack()
while (i ≥ 0)
)结束时,
best_path
将保持最佳路径(在新图中)。从那里你只需要获取边的有效载荷来重建原始图中的路径。
关于algorithm - 遍历所需边列表的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130147/
我是一名优秀的程序员,十分优秀!