【问题标题】:Get node label from boost::labeled_graph从 boost::labeled_graph 获取节点标签
【发布时间】:2015-06-17 20:59:49
【问题描述】:

我想在 BGL 的labeled_graph 中检索标记节点的标签,但找不到执行此操作的方法。

以下 MWE 演示了我正在寻找的内容:

//g++ -O3 question.cpp -o question.exe -I. --std=c++11 -lprotobuf-lite -lpthread -lz -losmpbf
#include <iostream>

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/labeled_graph.hpp>
#include <boost/graph/iteration_macros.hpp>

typedef long long node_id_t;

typedef boost::adjacency_list<
  boost::listS,           // Store out-edges of each vertex in a std::list
  boost::listS,           // Store vertex set in a std::list
  boost::bidirectionalS,  // The file dependency graph is directed
  boost::no_property,     // vertex properties
  boost::no_property      // edge properties
> AdjGraph;

typedef boost::labeled_graph<
  AdjGraph,
  node_id_t          // Node ID
> LabeledGraph;

int main(){
  LabeledGraph g;

  add_vertex( 10, g );
  add_vertex( 20, g );
  add_vertex( 30, g );
  add_vertex( 40, g );
  add_vertex( 50, g );

  boost::add_edge_by_label(10,30,g);
  boost::add_edge_by_label(10,50,g);
  boost::add_edge_by_label(30,40,g);
  boost::add_edge_by_label(50,20,g);

  BGL_FORALL_EDGES(e, g, LabeledGraph){
    auto source_n = boost::source(e,g);
    //How do I do the following?
    //std::cerr<<boost::get_label_of_vertex(source_n)<<std::endl;
  }
}

boost::get_label_of_vertex(source_n) 命令在我的挖掘中似乎不存在。

您知道是否有,或者是否有其他方法可以获取此信息?

【问题讨论】:

    标签: c++ boost boost-graph


    【解决方案1】:

    啊。我发现你的问题顺序错误:)

    我不认为labeled_graph&lt;&gt; 适配器有这个功能。相反,就像在我的 other answer 中一样,我建议将标签存储为顶点属性(捆绑或 vertex_index_t)。

    捆绑

    Live On Coliru

    // g++ -O3 question.cpp -o question.exe -I. --std=c++11 -lprotobuf-lite -lpthread -lz -losmpbf
    #include <iostream>
    
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/labeled_graph.hpp>
    #include <boost/graph/iteration_macros.hpp>
    
    struct MyVertex {
        long long label;
    
        MyVertex(long long label = 0) : label(label) {}
    };
    
    
    typedef boost::adjacency_list<boost::listS,          // Store out-edges of each vertex in a std::list
                                  boost::listS,          // Store vertex set in a std::list
                                  boost::bidirectionalS, // The file dependency graph is directed
                                  MyVertex,              // vertex properties
                                  boost::no_property     // edge properties
                                  > AdjGraph;
    
    int main() {
        AdjGraph g;
    
        std::map<size_t, AdjGraph::vertex_descriptor> vertex_map;
    
        for (int i = 1; i<6; ++i)
            vertex_map.emplace(10*i, add_vertex(10*i, g));
    
        boost::add_edge(vertex_map[10], vertex_map[30], g);
        boost::add_edge(vertex_map[10], vertex_map[50], g);
        boost::add_edge(vertex_map[30], vertex_map[40], g);
        boost::add_edge(vertex_map[50], vertex_map[20], g);
    
        BGL_FORALL_EDGES(e, g, AdjGraph) {
            auto source_n = boost::source(e, g);
            std::cerr << g[source_n].label << "\n";
        }
    }
    

    vertex_index_t室内物业

    Live On Coliru

    // g++ -O3 question.cpp -o question.exe -I. --std=c++11 -lprotobuf-lite -lpthread -lz -losmpbf
    #include <iostream>
    
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/labeled_graph.hpp>
    #include <boost/graph/iteration_macros.hpp>
    
    typedef boost::adjacency_list<boost::listS,          // Store out-edges of each vertex in a std::list
                                  boost::listS,          // Store vertex set in a std::list
                                  boost::bidirectionalS, // The file dependency graph is directed
                                  boost::property<boost::vertex_index_t, size_t>,    // vertex properties
                                  boost::no_property     // edge properties
                                  > AdjGraph;
    
    int main() {
        AdjGraph g;
    
        std::map<size_t, AdjGraph::vertex_descriptor> vertex_map;
    
        for (int i = 1; i<6; ++i)
            vertex_map.emplace(10*i, add_vertex(10*i, g));
    
        boost::add_edge(vertex_map[10], vertex_map[30], g);
        boost::add_edge(vertex_map[10], vertex_map[50], g);
        boost::add_edge(vertex_map[30], vertex_map[40], g);
        boost::add_edge(vertex_map[50], vertex_map[20], g);
    
        auto index = boost::get(boost::vertex_index, g);
    
        BGL_FORALL_EDGES(e, g, AdjGraph) {
            auto source_n = boost::source(e, g);
            std::cerr << boost::get(index, source_n) << "\n";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多