【问题标题】:Find connected components using Boost Graph library, with the vertex and edge type being boost::listS使用 Boost Graph 库查找连接的组件,顶点和边类型为 boost::listS
【发布时间】:2017-12-20 15:41:56
【问题描述】:

我正在尝试在无向图中查找连接的组件。该图由boost::adjacency_list 表示。对于我的应用程序,顶点和边的类型必须是boost::listS。我尝试了以下代码,但无法编译。但是,如果我将顶点和边类型更改为boost::vecS,代码就可以正常工作。关于如何修复代码的任何想法?

#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/connected_components.hpp>
typedef boost::adjacency_list<boost::listS,boost::listS,boost::undirectedS> Cluster;
int main() {
    using namespace boost;
    Cluster A;
    add_vertex(A);
    add_vertex(A);
    add_vertex(A);
    add_vertex(A); // add 4 vertex to the graph

    for (int i=0; i<2; i++){
        for (int j=(i+1); j<3; j++){
            std::cout<<i<<"  "<<j<<"\n";
            add_edge(vertex(i,A), vertex(j,A), A);
        }
    } // add edge between 0-1, 0-2, 1-2.

    std::vector<int> subclusters(num_vertices(A));
    int nclusters=boost::connected_components(A, &subclusters[0]); // find the connected components
}    

【问题讨论】:

    标签: c++ boost graph


    【解决方案1】:

    docs say¹ 组件映射需要使用键 vertex_descriptor 对可写属性映射进行建模,并将组件 ID 存储为值。

    您可能应该将make_assoc_property_map 与地图一起使用:

    Live On Coliru

    std::map<Cluster::vertex_descriptor, int> subclusters;
    int nclusters = boost::connected_components(A, boost::make_assoc_property_map(subclusters)); // find the connected components
    
    
    for (auto& p : subclusters) {
        std::cout << "Vertex " << boost::get(boost::vertex_index, A, p.first) << " is in cluster " << p.second << "\n";
    }
    

    打印:

    0 -- 1
    0 -- 2
    1 -- 2
    Vertex 0 is in cluster 0
    Vertex 1 is in cluster 0
    Vertex 2 is in cluster 0
    Vertex 3 is in cluster 1
    

    但我想要一个向量

    如果您坚持,您仍然可以使用向量,但您必须提供从顶点描述符到完整顶点 id 的映射:

    typedef boost::adjacency_list<
            boost::listS,
            boost::listS,
            boost::undirectedS,
            boost::property<boost::vertex_index_t, int>
        > Cluster;
    

    现在,您也必须填写该属性:

    Cluster A;
    add_vertex(0, A);
    add_vertex(1, A);
    add_vertex(2, A);
    add_vertex(3, A);
    

    然后你必须改用make_iterator_property_map,为间接提供一个顶点索引属性映射:

    std::vector<int> subclusters(4);
    auto comp_map = make_iterator_property_map(subclusters.begin(), get(boost::vertex_index, A));
    int nclusters = connected_components(A, comp_map); // find the connected components
    

    Live On Coliru

    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/connected_components.hpp>
    #include <iostream>
    
    typedef boost::adjacency_list<
            boost::listS,
            boost::listS,
            boost::undirectedS,
            boost::property<boost::vertex_index_t, int>
        > Cluster;
    
    int main() {
        Cluster A;
        add_vertex(0, A);
        add_vertex(1, A);
        add_vertex(2, A);
        add_vertex(3, A);
    
        for (int i = 0; i < 2; i++) {
            for (int j = (i + 1); j < 3; j++) {
                std::cout << i << " -- " << j << "\n";
                add_edge(vertex(i, A), vertex(j, A), A);
            }
        } // add edge between 0-1, 0-2, 1-2.
    
        // NOTE: 4, not "num_vertices", but enough to accomodate the highest value
        // of the `vertex_index` property
        std::vector<int> subclusters(4);
        auto comp_map = make_iterator_property_map(subclusters.begin(), get(boost::vertex_index, A));
        int nclusters = connected_components(A, comp_map); // find the connected components
    
        for (size_t id = 0; id < subclusters.size(); ++id) {
            std::cout << "Vertex id " << id << " is in cluster " << subclusters.at(id) << "\n";
        }
    }
    

    打印

    0 -- 1
    0 -- 2
    1 -- 2
    Vertex id 0 is in cluster 0
    Vertex id 1 is in cluster 0
    Vertex id 2 is in cluster 0
    Vertex id 3 is in cluster 1
    

    ¹

    【讨论】:

    • 完美运行!非常感谢。
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多