我是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。根据文档,似乎我的两个选项是filter_graph还是subgraph?老实说,似乎每个连接组件的过滤图都是最合理的?我的问题是kruskal将图作为第一个参数,而在我的代码中,我首先使用生成树来创建过滤后的图。因此,我陷入了一个循环问题。如何从经过过滤的图形或子图形到图形对象以满足该功能,以创建跨越树木的森林?