【问题标题】:Using Boost Graph Library (BGL) to identify connected components使用 Boost Graph Library (BGL) 识别连接组件
【发布时间】:2014-05-09 18:38:30
【问题描述】:

我正在尝试使用 Boost Ggraph 库。在我的程序的每次迭代中,我都有一组点,例如{1,2,3,4,5,6,7,8,9,10} 在迭代一中,{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 中创建无向图并遍历连接的组件?

【问题讨论】:

    标签: c++ boost graph boost-graph


    【解决方案1】:

    您需要包含以下标题:

    #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 << " ";
    

    【讨论】:

    • 谢谢@taketwo。如果我在这个集合中有几个子图,boost 是否也给了我可用子图的数量?我可以用这个遍历我的子图吗?
    • 是的,boost 返回找到的组件的数量(正如人们所期望的,它存储在倒数第二个 sn-p 中的 num_components 中)。此外,最后一个 sn-p 显示了如何迭代特定组件(即子图)的顶点。您可以在它周围添加另一个循环来迭代所有组件。另一种选择是查看boost-subgraph。顺便说一句,如果您的原始问题得到解答,请接受答案。
    • 这是不正确的,例如,如果从图中删除了顶点描述符为 0 的顶点,则该图由顶点描述符 1、2、...、boost::num_vertices(c) 组成。您需要跟踪这些顶点的顶点描述符,假设任何给定时间的顶点描述符只是 0 -> num_vertices()-1 是不安全的。
    • 我想你的意思是std::cout &lt;&lt; i &lt;&lt; " "; 没有给我们顶点描述符,而是给我们图形顶点向量的顺序索引?请提出修复建议,我很乐意更新最后一个 sn-p。
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多