使用 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() 在未加权、无向图中查找路径的主要内容,如果未能解决你的问题,请参考以下文章

Boost库,如何获取相邻节点?

从特定顶点执行深度优先算法

使用列入黑名单的边提升过滤图

使用boost模块而不使用boost的其余部分?

在不使用 boost::promise 的情况下在 boost 线程中返回值

使用 boost::mpl 获取 boost::variant 的类型索引