2016-12-08 15 views
-1

NB : 아래의 질문은 "부스트 그래프"의 문맥입니다. 그러나이 문제는 아마도 "C++"문제 또는 "부스트 그래프"문제 일 수 있습니다.undirected_dfs : 모서리 벡터를 얻는 법

나는 가장자리의 벡터를 얻기 위해 노력하고, 부스트 그래프undirected_dfs 사용.

코드는 올바르게 back_edge 및 tree_edge를 인쇄합니다.

제 목표는 모서리 벡터를 검색하는 것입니다. 이 작업을 위해 나는 모서리의 벡터 벡터를 사용한다. tree_edge가 발견되면

은 그래서,이 벡터에 저장 :

myList.push_back(edgeVisited); 
다음 back_end 찾으면

edgeVisited.push_back(e); 

, 나 벡터의 벡터의 가장자리의 벡터 (edgeVisited)를 저장

이 작업이 끝난 직후 myList의 크기를 확인합니다.

undirected_dfs에 대한 호출 후
std::cout << "myList size by back_edge: " << myList.size() << std::endl; 

, 난

std::vector< std::vector<edge_t> > vctr = vis.GetEdges(); 

으로 myList를 얻을에 의해 그것을 크기를 확인하려면 : 결과는 정확

std::cout << vctr.size() << std::endl; 

그러나 벡터는 무효가됩니다 .

왜이 벡터 벡터가 null인지 이해해 주시겠습니까?

Here is the whole code: 
#include <iostream> 
#include <string> 
#include <boost/cstdlib.hpp> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/undirected_dfs.hpp> 
#include <boost/graph/graphviz.hpp> 

using namespace boost; 
typedef adjacency_list< 
    vecS, 
    vecS, 
    undirectedS, 
    no_property, 
    property<edge_color_t, default_color_type> > graph_t; 

typedef boost::graph_traits<graph_t>::vertex_descriptor vertex_t; 
typedef boost::graph_traits < graph_t>::edge_descriptor edge_t; 

struct detect_loops : public boost::dfs_visitor<> 
{ 
    template <class edge_t, class Graph> 

    void back_edge(edge_t e, const Graph& g) { 
     std::cout << source(e, g) << " -- " << target(e, g) << "\n"; 
     edgeVisited.push_back(e); 
     myList.push_back(edgeVisited); 
     edgeVisited.clear(); 
     std::cout << "myList size by back_edge: " << myList.size() << std::endl; 
    } 
    template <class Graph> 
    void tree_edge(edge_t e, const Graph& g) { 
     std::cout << "tree_edge: " << boost::source(e, g) << " --> " << boost::target(e, g) << std::endl; 
     edgeVisited.push_back(e); 
    } 
    //get the vectors. 
    std::vector< std::vector<edge_t> > GetEdges() const { 
     std::cout << "MyList by GetEdges : " << myList.size() << std::endl; 
     return myList; 
    } 

private: 
    std::vector<edge_t> edgeVisited; 
    std::vector< std::vector<edge_t> > myList; 
}; 

void make(graph_t &g) 
{ 
    //Create the graph 
    boost::add_edge(0, 1, g); 
    boost::add_edge(0, 2, g); 
    boost::add_edge(1, 3, g); 
    boost::add_edge(2, 3, g); 
    boost::add_edge(2, 4, g); 
    boost::add_edge(3, 5, g); 
    boost::add_edge(4, 5, g); 
    //print the graph 
    std::ofstream f("d:\\tmp\\dot\\s13.dot"); 
    boost::write_graphviz(f, g); 
    std::system(std::string("dot -Tsvg -Grankdir=LR -Nfontsize=24 d:\\tmp\\dot\\s13.dot > d:\\tmp\\dot\\s13.svg").c_str()); 
} 

int main(int, char*[]) 
{ 
    graph_t g; 
    make(g); 

    detect_loops vis; 
    undirected_dfs(g, root_vertex(vertex_t(0)).visitor(vis) .edge_color_map(get(edge_color, g))); 
    std::vector< std::vector<edge_t> > vctr = vis.GetEdges(); 
    std::cout << vctr.size() << std::endl; 

    return boost::exit_success; 
} 

감사

답변

0

그것은 "C++"문제는 더 있었다. 여기에 솔루션입니다 : 내가 클래스 detect_loop

detect_loops(std::vector< std::vector<edge_t> > &vctr) 

에 입력 매개 변수로 벡터의 벡터를 추가하고 전화 :

전부
std::vector< std::vector<edge_t> > vctr; 
detect_loops vis(vctr); 

. 감사합니다.