我正在尝试使用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中创建无向图并迭代连接的组件?
答案 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 << " ";