c++ - Boost Graph 库中两个节点之间的所有路径

标签 c++ boost graph-theory boost-graph

我需要找到图中两个节点之间的所有简单(非循环)路径。我了解如何通过修改后的广度优先搜索来实现这一点,所以我正在查看 Boost 中的 BFS,但我看不到如何更改算法的步骤,只能更改访问者。

在我继续从头开始编写新算法之前,有没有一种方法可以通过使用现有算法在 BGL 中实现这一点,有或没有自定义访问者?

最佳答案

我们可能需要更多地了解您的图表。我有一个“类似”的问题。

这可能不是您正在寻找的,但它是相似的。这是我在带 Root过的有向图上使用的 DFS 访问者,用于计算从起始节点到所有其他(可达)节点的路径数。

之所以可行,是因为我的图是一个 Root过的 DAG。我必须先反转图形,这样我的起始节点实际上是一个汇节点。然后源节点成为 DAG 的根。如果我想要实际路径,我可能会添加一个堆栈来告知路径历史记录。 enter image description here

//depth first search to calculate path number, calculates the number of paths to a target
// conceptually equivalent to a topological sort.
class PathNumDFSVisitor:public boost::default_dfs_visitor{

public:
    PathNumDFSVisitor(boost::unordered_map<std::string,std::size_t>& inMap):pathNumMap(inMap){}

    template < typename Vertex, typename Graph >
    void finish_vertex(Vertex u, const Graph & g)
    {
        std::string term = g[u].termId;

        if(boost::out_degree(u,g) == 0){
            pathNumMap[term] = 1;
        }else{
            pathNumMap[term] = 0;
            //Iterate over the children of the term to add the child annotations
            typename boost::graph_traits< Graph >::out_edge_iterator ei, e_end;
            for(tie(ei, e_end) = boost::out_edges(u, g); ei != e_end; ++ei){

                Vertex v = boost::target(*ei, g);

                std::string childTermId = g[v].termId;
                pathNumMap[term] += pathNumMap[childTermId];
            }
        }
    }

    boost::unordered_map<std::string,std::size_t>& pathNumMap;
};

但在一般情况下,我会建议计算最短路径,然后依次使用每条边并找到从源到目标的替代路径。现在该边缘可能是两条或更多条边缘,而这又需要放宽并考虑替代路径。就像Sehe说的那样,它就是一个生成器,而且它可以在一般的无向图中快速爆炸。如果我们对您的图形约束了解更多一点,也许我们可以提供更多帮助。

也许添加最大路径长度条件可以帮助限制您生成的简单路径的数量。

考虑这个通用的全连接图。 enter image description here

我们需要计算AB之间的所有路径。

所以我们需要所有 1 条边路径 + 所有 2 条边路径加上 ...

所以我们需要A - B,一条边。

然后是所有 2 条边路径。 A - ? - B,共有3个

然后所有 3 条边路径 A - ? - ? - B, 有3 * 2.

以此类推,有 4 个或更多边。

您可以看到随着 N 的增长,我们达到 N-2 * N-3 * N-4 ... 等等。这是阶乘爆炸,O(N!)。

这些示例说明了不同的拓扑结构如何导致截然不同的算法和复杂性。要从 SO 中获得直接/有用的答案,请提供任何有帮助的细节。

关于c++ - Boost Graph 库中两个节点之间的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30121484/

相关文章:

c++ - 如何使用 QSettings 在 Qt 应用程序中加载设置

c++ - 制表符(\t)有多少个空格?

c++ - 如何在计算中处理 "unsigned long long int"?

c++ - "std::string const &s"和 "const std::string &s"有什么区别?

python - 在 ubuntu 14.04 上安装 graph-tool 时配置错误

c++ - 使用 boost::interprocess offset_ptr

c++ - 我可以使用 std::shared_ptr 而不是 boost::shared_ptr 构建 boost 库吗

algorithm - 循环图中最长路径问题的优化

algorithm - 是否存在仅通过每种颜色一次的路径?

rust - Rust中的异构容器的图形