View
3.614
Download
0
Category
Preview:
DESCRIPTION
Boost.勉強会 #2のときに使用したスライドです。
Citation preview
Boost.Graph 入門の入門
H.22/09/11EgtraBoost. 勉強会 #2
自己紹介
• Egtra • Twitter: @egtra
お約束など
• #include <boost/graph/adjacency_list.hpp>– 残念ながらほかのヘッダの出番はありません
• using namespace boost;– 主にスペースの都合
• 注意 : C++0x の auto 使います– 主にスペースの都合
グラフ
• 「頂点」 (vertex) と「辺」 (edge)からなるデータ構造
グラフでないもの
• 配列・線形リンクリスト– 直線(一次元)
• 木(ツリー)
有向グラフ・無向グラフ
• 辺に向きがあるかないか
さっそく使ってみる
頂点と辺の操作 その 1
• 変数を作る– adjacency_list<> g;
• 頂点の追加– auto u = add_vertex(g);– auto v = add_vertex(g);
• 辺の追加– auto result = add_edge(u, v, g);– auto edge = result.first;
頂点と辺の操作 その 2
• 辺の削除– remove_edge(edge, g);– または remove_edge(u, v, g);
• 頂点の削除– remove_vertex(v, g);
• すべて削除– g.clear();
中をたどる
• auto t = vertices(g);• BOOST_FOREACH(auto e, t)
{std::cout << e << std::endl;
}• e は u, v と同じ型
– さらに、この例では整数型(必ずではない)
Range です
• これもコンパイル・実行可能。• std::for_each(
boost::begin(t),boost::end(t),……);
• t | pstade::oven::……
さらに Range (1)
• 接する頂点• auto t = adjacent_vertices(v, g)
v
さらに Range (2)
• 接する辺• auto t = adjacent_edges(v, g)
v
おまけ残り時間の許すところまで進みます。
頂点と辺の型
• 頂点– adjacency_list<>::vertex_descriptor– または
graph_traits<adjacency_list<>>::vertex_descriptor
• 辺– adjacency_list<>::edge_descriptor– または
graph_traits<adjacency_list<>>::edge_descriptor
その他読み取り関数• 辺→両端の頂点 : source, target• 両端の頂点→辺 : edge,
edge_range• インデックス→頂点 : vertex
• 頂点の数 : num_vertices• 辺の数 : num_edges• すべての辺 : edges
Boost.Graph に入門するまで
あと一歩
adjacency_list (1)
• ずばり「グラフ型」 ( の 1 つ )• Boost.Graph を使い始める最大の難関• テンプレート引数が多い
– adjacency_list<OutEdgeList, VertexList, Directed, VertexProperties, EdgeProperties, GraphProperties, EdgeList>
– ドキュメント見る気がなくなる
adjacency_list (2)• OutEdgeList, VertexList
– 頂点と辺にどんなコンテナを使うか– 挿入・削除・参照などの時間が変化– 削除時に記述子が無効になるか否かが変化
• Directed– 有向グラフか無向グラフか
• 残りのテンプレート引数– 入門の入門では扱いません
扱わなかったもの
• 以下、 Boost.Graph に入門したらきっと使う機会が出てくるでしょう
• プロパティマップ• アルゴリズム
– breadth_first_search– depth_first_search– Etc……
• Graphviz 形式入出力
まとめ : グラフへの操作
• 参照– 辺・頂点の数 – すべての辺・頂点– ある頂点から伸びる辺– ある辺に接する頂点 (2 つ )
• 変更– 頂点を加える・取り除く– 辺を加える・取り除く
Recommended