使用BGL从矢量填充树

时间:2017-08-15 08:06:05

标签: c++11 vector tree boost-graph

我有两个对象向量,我需要从它们制作树形结构。我们假设我们有vector <obj> parentsvector <obj> leaves。因此,vector <obj> parents的每个元素都有几个位于树末端的叶子。我正在做的是定义Vertex propertiesEdges properties,如下所示,然后定义bidirectional graph

struct VertexData
{
    std::string obj_name; // concatenation of labels
    std::string obj_class_num;
    int num;
    vector <int> segments_list;
    bool is_leaf=false;
};

struct EdgeData
{
    std::string edge_name;
    double confidence;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS,
        boost::bidirectionalS,
        VertexData,
        boost::property<boost::edge_weight_t, double, EdgeData> > Graph;

Graph graph;
  1. 第一种方法:循环遍历vector <obj> leaves,对于每个成员,我找到了父级并创造了优势。然后为边和顶点指定属性。但是对于下一个叶子,我应该检查它是否已经在树中有一个父项,或者我应该为它的父项添加一个新的顶点。

  2. 第二种方法:我尝试过的另一件事是循环遍历vector <obj> parents,并为每个元素尝试制作它的叶子。但我不确定这样做的正确方法是什么。 这是一个链接: adding custom vertices to a boost graph我尝试做同样但迭代。

  3. 为第一种方法添加的代码:

    vector <class1> parents; // this has some objects of type class1
    vector <class2> leaves; // this has some objects of type class2
    
    /// declare the graph
    typedef boost::adjacency_list<boost::vecS, boost::vecS,
            boost::bidirectionalS,
            VertexData,
            boost::property<boost::edge_weight_t, double, EdgeData> > Graph;
    
    /// instantiate the graph
    Graph graph;
    
    typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t;
    typedef boost::graph_traits<Graph>::edge_descriptor edge_t;
    vector<vertex_t> obj_vertices;
    vector<string>   parents_labels_v;
    bool parent_exist=false;
    
    
    /// loop through leaves and make edges with associated parent
    for (auto leaf: leaves) {
    
        int leaf_nr = leaf.Number;
    
        vertex_t v = boost::add_vertex(graph); // this is the leaf vertex
        graph[v].num     = leaf_nr;         // leaf number
        graph[v].is_leaf = true;
        /// access the parent label by leaf number
        string label1 = parents[leaf_nr].label;
    
        /// check if the parent already exist, using its label
        if(std::find(parents_labels_v.begin(), parents_labels_v.end(), label1)
           != parents_labels_v.end()){
            parent_exist = true;
        }else{
            parents_labels_v.push_back(label1);
        }
    
        if(parent_exist) {
            // find already_exist parent vertex to make the edge
            vertex_t u = ???  here i have problem
            // Create an edge connecting those two vertices
            edge_t e; bool b;
            boost::tie(e,b) = boost::add_edge(u,v,graph);
        } else{
            // if parent-vertex there is not, add it to the graph
            vertex_t u = boost::add_vertex(graph); // this is the parent vertex
            graph[u].obj_name = label1;
            graph[u].segments_list.push_back(leaf_nr);
            obj_vertices.push_back(u);
    
            // Create an edge connecting those two vertices
            edge_t e; bool b;
            boost::tie(e,b) = boost::add_edge(u,v,graph);
        }
    
    }
    

0 个答案:

没有答案