首页 > 解决方案 > 如何在 Boost 的图形库中创建生成树的森林?

问题描述

我是 Boost 图形库的新手,但它似乎非常强大。使用我发现的其他帖子,我设法创建了一个无向图,其顶点/边具有自定义类来保存我需要的其他信息。我还设法创建了所述图的生成树。创建生成树后,我从源顶点开始进行 DFS,并在访问者中进行必要的处理。实现这一点的代码的基本部分如下:

struct InSpanning {
                std::set<EdgeDescriptor> edges;
                bool operator()(EdgeDescriptor e) const { return edges.count(e); }
            } spanning;

            boost::kruskal_minimum_spanning_tree(graph, std::inserter(spanning.edges, spanning.edges.end()), boost::weight_map(get(&EdgeInfo::weight, graph)));
            MyVisitor vis();
            boost::filtered_graph<Graph, InSpanning, boost::keep_all> mst(graph, spanning, {});
            boost::depth_first_search(mst, visitor(vis).root_vertex(0));

现在,我的问题是,如何处理我的图表断开连接的情况?我知道我可以通过 boost::connected_components 识别这种情况,但我不清楚如何实际更改上面的代码段,因为我想继续使用 kruskal 的。根据文档,似乎我的两个选项是filtered_graph 或subgraph?老实说,似乎每个连接组件的过滤图是最合理的?我的问题是 kruskal 将图形作为第一个参数,在我的代码中,我首先使用生成树来创建过滤后的图形。所以,我遇到了一个循环问题。如何从过滤图或子图转到图对象以满足函数以创建生成树的森林?

标签: c++boost

解决方案


推荐阅读