使用Boost Graph Library(BGL)识别连接的组件

ziv*_*ziv 3 c++ boost graph boost-graph

我正在尝试使用Boost Ggraph库.在我的程序的每次迭代中,我有一组点,例如{1,2,3,4,5,6,7,8,9,10}在迭代1和{1,2,3,... ,1000}迭代二,......

对于每个点,我知道它连接到哪些其他点,例如在迭代时,每个点连接如下:

c(1)={3,5,7,8}   
c(2)={}   
c(3)={1,4,10}   
c(4)={3}    
c(5)={1,9}   
c(6)={}    
c(7)={1,8}    
c(8)={1,7}    
c(9)={5}    
c(10)={3}    
Run Code Online (Sandbox Code Playgroud)

每个点都有一个属性,例如p(1)= 10,p(2)= 100,p(3)= 20,...

如何在Boost中创建无向图并迭代连接的组件?

tak*_*two 9

您需要包含以下标题:

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/connected_components.hpp>
Run Code Online (Sandbox Code Playgroud)

然后,您需要为图表声明一个类型.以下内容适用于您提供的要求,但是您可能需要查阅此页面以了解有关模板参数的其他选择的更多信息:

typedef
  boost::adjacency_list<
    boost::vecS            // edge list
  , boost::vecS            // vertex list
  , boost::undirectedS     // directedness
  , float                  // property associated with vertices
  >
Graph;
Run Code Online (Sandbox Code Playgroud)

您可以创建具有给定点数的图形,稍后您可以添加更多点:

Graph c (10);              // create a graph with 10 points
boost::add_vertex (c);     // add a vertex to the graph
Run Code Online (Sandbox Code Playgroud)

要添加边使用(请注意,从0开始枚举顶点):

boost::add_edge (0, 1, c); // add an edge between vertices 0 and 1 in the graph
Run Code Online (Sandbox Code Playgroud)

最后,使用以下代码片段,您可以计算图表中的连接组件:

std::vector<int> component (boost::num_vertices (c));
size_t num_components = boost::connected_components (c, &component[0]);
Run Code Online (Sandbox Code Playgroud)

函数返回的值是找到的组件数.component向量中的每个项目都将设置为相应顶点的组件ID.这意味着您可以迭代它,例如打印属于特定组件的顶点:

std::cout << "Vertices in the first component:" << std::endl;
for (size_t i = 0; i < boost::num_vertices (c); ++i)
  if (component[i] == 0)
    std::cout << i << " ";
Run Code Online (Sandbox Code Playgroud)