Boost.Graph入門

4,939 views

Published on

Boost.勉強会 #2のときに使用したスライドです。

Published in: Technology
  • Be the first to comment

Boost.Graph入門

  1. 1. Boost.Graph 入門 H.22/09/11 Egtra Boost.勉強会 #2
  2. 2. 自己紹介 • Egtra / 一戸優介 • Twitter: @egtra
  3. 3. お • <boost/graph/adjacency_list.hpp> 以外も少し使ったよ • Variadic Templates使っていないよ
  4. 4. グラフ • 「頂点」(vertex) と「辺」(edge) からなるデータ構造
  5. 5. グラフでないもの • 配列・線形リンクリスト – 直線(一次元) • 木(ツリー)
  6. 6. 有向グラフ・無向グラフ • 辺に向きがあるかないか
  7. 7. 頂点と辺の操作 その1 • 変数を作る – adjacency_list<> g; • 頂点の追加 – auto u = add_vertex(g); – auto v = add_vertex(g); • 辺の追加 – auto result = add_edge(u, v, g); – auto edge = result.frst;
  8. 8. 頂点と辺の操作 その2 • 辺の削除 – remove_edge(edge, g); – または remove_edge(u, v, g); • 頂点の削除 – remove_vertex(v, g); • すべて削除 – g.clear();
  9. 9. 中をたどる • auto t = vertices(g); • BOOST_FOREACH(auto e, t) { std::cout << e << std::endl; } • eはu, vと同じ型 – さらに、この例では整数型(必ずではな い)
  10. 10. Rangeです • これもコンパイル・実行可能。 • std::for_each( boost::begin(t), boost::end(t), ……); • t | pstade::oven::……
  11. 11. さらにRange (1) • 接する頂点 • auto t = adjacent_vertices(v, g) v
  12. 12. さらにRange (2) • 接する辺 • auto t = adjacent_edges(v, g) v
  13. 13. 頂点と辺の型 • 頂点 – adjacency_list<>::vertex_descriptor – またはgraph_traits<adjacency_list<>> ::vertex_descriptor • 辺 – adjacency_list<>::edge_descriptor – またはgraph_traits<adjacency_list<>> ::edge_descriptor
  14. 14. その他読み取り関数 • 辺→両端の頂点 : source, target • 両端の頂点→辺 : edge, edge_range • インデックス→頂点 : vertex • 頂点の数 : num_vertices • 辺の数 : num_edges • すべての辺 : edges
  15. 15. adjacency_list (1) • ずばり「グラフ型」(の1つ) • Boost.Graphを使い始める最大の難関 • テンプレート引数が多い – adjacency_list<OutEdgeList, VertexList, Directed, Vertex Properties, EdgeProperties, GraphProperties, EdgeList> – ドキュメント見る気がなくなる
  16. 16. adjacency_list (2) • OutEdgeList, VertexList – 頂点と辺にどんなコンテナを使うか – 挿入・削除・参照などの時間が変化 – 削除時に記述子が無効になるか否かが変化 • Directed – 有向グラフか無向グラフか • 残りのテンプレート引数 – 入門の入門では扱いません
  17. 17. 扱わなかったもの • 以下、Boost.Graphに入門したら きっと使う機会が出てくるでしょう • プロパティマップ • アルゴリズム – breadth_frst_search – depth_frst_search – Etc…… • Graphviz形式入出力
  18. 18. おさらい: グラフへの操作 • 参照 – 辺・頂点の数 – すべての辺・頂点 – ある頂点から伸びる辺 – ある辺に接する頂点(2つ) • 変更 – 頂点を加える・取り除く – 辺を加える・取り除く
  19. 19. JR最長片道切符 • とにかく遠回りして一番長い距離の 切符(のルート)を求める – – JR路線網→グラフ! – – 路線網をBoost.Graphで表現 – →総当たりする
  20. 20. 力尽きたよ…… • 北海道の路線を打ち込んだところで ギブアップ
  21. 21. ついでなんで運賃を
  22. 22. なぜBoost.Graph? • イテレータでのアクセスがある – 辺・頂点 – 一部はpair<iter, iter> – Rangeだ! • malloc/for→STL(コンテナ/アルゴリズム) – のような

×