tree 쓰려고 stl 문 두드렸더니 BGL 로 가라고 한다.
가이드 친절히 쓰여있지만 정리해보고 가자.
0. 기타
stl 을 재료로 만든게 bgl.
bgl은 adjacency list, adjacency matrix, edge list 자료구조를 제공함.
애네들을 만들때 템플릿으로 조정 가능.
그래프의 두 축인 vertex, edge 를 위 자료구조에 넣으면 그래프 완성.
일단 이 글에선 adjaceny list 로 만든 graph 튜토리얼을 정리할 것임.
bgl 사용하는 건 파일 받아서 include 만 하면 됨.
다만 include 잘 되도록 additional directory 설정을 해둬야함.
1. 생성 준비
vertex 정보와 index 정보는 BGL 에서 두가지 방법으로 구성할 수 있는데, 위처럼 그냥 struct 나 class 로 하는걸 추천한다. 다른 방법은 튜토리얼이나 구버전에서 나돌아다닌다고 한다.
adjacency_list 생성에 필요한 템플릿은 7개 인자가 있다. 기니까 typedef 로 사용하라고 한다. 그리고 자주 사용되는 건 앞에 5개이다. 차례로 outEdgeList, vertexList, directed, vertexProperties, edgeProperties 인데, 하나씩 살펴보자.
edgeList - edge list 를 어떻게 구성할거냐. vecS 면 std::vector 로 edge 를 저장한다는 말. 튜토리얼 보면 여러개 더 있다. 쌍방향 그래프로 하면 이 list 가 두개가 된다.
vertexList - vertex list 를 어떻게 구성할거냐.
directed - 그래프에 edge 의 방향성 여부. bidirectionalS, directionalS, undirectedS 이렇게 있다.
edgeProperties - edge 에 들어갈 정보. 여기에 넣으면 내부적으로 값이 있다. 싫으면 외부에 따로 list 만들어서 여기서 만든 그래프에서 edge index 뽑아서 접근하면 된다. 여기선 위에 있는 struct 를 사용할 것임.
graphProperties - vertex 에 들어갈 정보. 위랑 거의 같다.
2.생성
위부터 지금부터 사용할 edge_array, vertex_property_array, edge_property_array 이다.
여기서 edge/graph Properties 와 edge/vertex index 가 다르다는 것을 주의깊게 봐야한다. index 는 내부적으로 사용되는 것이고, Property 는 index와 따로 저장된다. 한마디로 인덱스 데리고 와서 Property 를 꺼내 쓰는 것이다.
생성법 1. Vertex 가 기본생성자로 생성된다. 인덱싱하면 vertex 값이 나오므로 그걸 변경해서 조정함.
생성법 2. add_vertex / edge 로 생성한다.
생성법 3. edge_array 를 만들어서 array 주소, array 끝주소, vertex num 넣어서 초기화.
생성법 4. edge_array 에 더해서 edge_property 도 한번에 초기화.
3. iterator
iter 은 일단 저 두개를 쓴다. dereference 를 하면 Graph 에 넣을 vertex / edge 의 인덱스가 뜬다.
vertices(tree), 여기서 tree는 위에서 만든 그래프다. vertices 는 std::pair<vertex_iter, vertex_iter> 을 리턴하며, 앞에건 맨 처음을 가리키는 iter, 뒤에건 맨 뒤를 가리키는 iter 이다. 그래서 위같은 사용이 가능한 것이다.
프린트 값은 vertex index, 그 인덱스의 property 인 code, name 순으로 나온다.
edges(tree) 도 마찬가지. 위처럼 std::pair 쓸수도 있지만, tie 를 사용할 수도 있다.
dereference 된 자료형은 boost::graph_traits<Graph>::vertex_descriptorr 이런류라는 걸 여기서 알아두자.
4. std::for_each
std::for_each 는 stl 자료형의 begin 과 end 늘 걸어서 객체의 아이템을 하나씩 처리시키는 방법이다.
처리시킬때 함수를 넣기도 하지만, struct 등에 operator() overloading 을 하면 이게 적용도 되서 자주 쓰인다.
이걸 적용시켜서 in, out edge, adjacency vertex 를 튜토리얼에도 소개하므로 여기도 똑같이 해보자.
인자가 vertex_iterator 의 dereference 인 vertex_descriptor 라는 점을 인지하자.
5. 알고리즘
알고리즘마다 다른데 dijkstra 는 weight 가지고 distance 를 뽑는 알고리즘임.
BGL은 역사가 오래되서 그런지 bundle property 추천하더니 이거쓰는 예시는 아래빼고 더럽게 안나옴.
bundle property 쓰면 지금까지는 property map 필요없이 운영이 가능함.
근데 이제 써야하니까 대가리가 아파옴.
대충 훑은거 정리하면, property_map 은 . 찍어서 계속 만들수 있음. 위에서 weight 뒤에 distance map 만든거처럼.
boost::no_named_parameters() 로 시작찍고, . 찍고, 내부에서 레지스트된 weight_map 을 boost::get 으로 만들고, 그렇게 만들어진 맵 뒤에 . 찍고, 다시 내부에서 레지스트된 distance_map 을 외부 구조체 주소 들고와서 구성하는 거임. 그리고 distance_map에 결과물이 찍히는 것.
댓글 없음:
댓글 쓰기