使用 Boost 的图 breadth_first_search() 在未加权、无向图中查找路径
Posted
技术标签:
【中文标题】使用 Boost 的图 breadth_first_search() 在未加权、无向图中查找路径【英文标题】:Using Boost's graph breadth_first_search() to find a path in an unweighted, undirected graph 【发布时间】:2009-01-14 12:51:39 【问题描述】:我正在使用 adjacency_list 图,具有无向和未加权的边。我需要找到顶点 u 和顶点 v 之间的最短路径。 我应该从你开始使用breadth_first_search() 吗?到达v时,如何获取路径,如何停止搜索?
谢谢!
【问题讨论】:
也许这将有助于开始:***.com/questions/14126/… 【参考方案1】:是的,从你开始做breadth_first_search()。
FOR every vertex i meet
IF i==v: BREAK
record predecessor of i as i.p
要找到最短路径,从v开始:
PRINT_PATH(u, v)
IF v==u
print u
ELSEIF v.p==NIL
print 'no path from u to v exists'
ELSE PRINT_PATH(u, v.p)
print v
【讨论】:
【参考方案2】:您应该使用最短路径算法之一,Dijkstra Shortest Path 是最合适的,因为您只需要找到两个顶点之间的路径。在 boost 发行版中有一个 example 用于它的用途。从该函数获取输出有多种选择:通过提供距离属性图或构建前驱图或编写自定义访问者。
【讨论】:
这个问题与未加权的图有关。要在未加权图中找到最短路径,最简单的方法是广度优先搜索。 Dijkstra 的算法解决了加权有向图上的单源最短路径问题。【参考方案3】:您需要使用minimum spanning tree: 搜索算法。这是一个非常简单直接的贪心算法。
【讨论】:
如果我没记错的话,最小生成树不一定包含两个特定顶点之间的最短路径。 我认为大多数最小生成树算法都不是贪心的(在做出贪婪的、次优选择的意义上),但它们实际上找到了最优的最小生成树。 @dehmann 不正确。现在常用的算法有两种,Prim算法和Kruskal算法。两者都是在多项式时间内运行的贪心算法。贪婪并不意味着次优选择,它意味着在不考虑进一步步骤的情况下做出最佳表面选择。 @dehmann...en.wikipedia.org/wiki/Dijkstra's_algorithm 也是贪婪的(也是最优的)。 @JessePepper 是的,但肯定不能保证最小生成树为您提供两点之间的最佳路径。以上是关于使用 Boost 的图 breadth_first_search() 在未加权、无向图中查找路径的主要内容,如果未能解决你的问题,请参考以下文章