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;
}
감사