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

时间:2014-03-30 13:10:16

标签: c++ boost graph boost-graph

我正在尝试使用Boost Ggraph库。在我的程序的每次迭代中,我都有一组点,例如迭代1上的{1,2,3,4,5,6,7,8,9,10}和迭代2上的{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}    

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

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

1 个答案:

答案 0 :(得分:7)

您需要包含以下标题:

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/connected_components.hpp>

然后你需要为你的图表声明一个类型。以下内容适用于您提供的要求,但您可能需要咨询this page以了解有关模板参数的其他选择的更多信息:

typedef
  boost::adjacency_list<
    boost::vecS            // edge list
  , boost::vecS            // vertex list
  , boost::undirectedS     // directedness
  , float                  // property associated with vertices
  >
Graph;

您可以使用给定的点数创建图表,稍后可以添加更多点:

Graph c (10);              // create a graph with 10 points
boost::add_vertex (c);     // add a vertex to the graph

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

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

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

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

函数返回的值是找到的组件数。 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 << " ";