p_tan's blog

勉強日記です。ツッコミ大歓迎

グラフの型と基本的な操作2

グラフの型と基本的な操作 - p_tanのお勉強日記の隣接リストに続いて隣接行列。
参考サイト↓
Boost Graph Library: Adjacency Matrix(日本語)
Boost Graph Library: Adjacency Matrix - 1.43.0(英語)

adjacent_matrix

サンプルコード。

#include <iostream>
#include <boost/graph/adjacency_matrix.hpp>
#include <boost/graph/graph_utility.hpp>    // for print_edges, print_vertices, print_graph

int main(int argc, char* argv[])
{
    enum { A, B, C, D, E, F, N};   // 頂点インデックス用
    const char* name = "ABCDEFG";    // 頂点名
    // 隣接行列による無向グラフの型宣言
    typedef boost::adjacency_matrix<boost::undirectedS> UGraph;
    UGraph ug(N);   // N頂点のグラフ生成
    // 辺追加
    boost::add_edge(B, C, ug);
    boost::add_edge(B, F, ug);
    boost::add_edge(C, A, ug);
    boost::add_edge(D, E, ug);
    boost::add_edge(F, A, ug);

    // 頂点出力
    std::cout << "頂点数 : " << boost::num_vertices(ug) << std::endl;
    std::cout << "頂点リスト: ";
    boost::print_vertices(ug, name);
    std::cout << std::endl;
    // 辺出力
    std::cout << "辺数: " << boost::num_edges(ug) << std::endl;
    std::cout << "辺リスト: ";
    boost::print_edges(ug, name);
    std::cout << std::endl;
    // グラフ出力
    std::cout << "隣接頂点リスト: " << std::endl;
    boost::print_graph(ug, name);
    std::cout << std::endl;
    // 辺削除
    std::cout << "辺(B, C)を削除" << std::endl;
    boost::remove_edge(B, C, ug);
    std::cout << "辺数: " << boost::num_edges(ug) << std::endl;
    std::cout << "辺リスト: ";
    boost::print_edges(ug, name);
    std::cout << std::endl;
    // 頂点に接続する辺の全削除
    std::cout << "頂点Aに接続する辺の削除(頂点A自体は残る)" << std::endl;
    boost::clear_vertex(A, ug);
    std::cout << "辺数: " << boost::num_edges(ug) << std::endl;
    std::cout << "辺リスト: ";
    boost::print_edges(ug, name);
    std::cout << "頂点数 : " << boost::num_vertices(ug) << std::endl;
    std::cout << "頂点リスト: ";
    boost::print_vertices(ug, name);
    std::cout << std::endl;

    return 0;
}

出力↓

頂点数 : 6
頂点リスト: A B C D E F

辺数: 5
辺リスト: (C,A) (C,B) (E,D) (F,A) (F,B)

隣接頂点リスト:
A <--> C F
B <--> C F
C <--> A B
D <--> E
E <--> D
F <--> A B

辺(B, C)を削除
辺数: 4
辺リスト: (C,A) (E,D) (F,A) (F,B)

頂点Aに接続する辺の削除(頂点A自体は残る)
辺数: 2
辺リスト: (E,D) (F,B)
頂点数 : 6
頂点リスト: A B C D E F

adjacency_listと同じく有向/無向の指定をテンプレート引数で行う。
adjacency_listと違って辺・頂点のコンテナの指定はできない。
また、オブジェクトを生成した後の頂点の追加/削除も出来ない。
(boost 1.43.0現在。ソースを見ると UNDER CONSTRUCTION って書いてるのでそのうち出来るようになるかも。)
その他の操作は大体adjacency_listと同じ。
隣接行列については以上。

utility関数各種

 boost/graph/graph_utility.hpp にprint***関数がそろっているのでコンソールへの出力に便利。
上のサンプルでは頂点の名前を指定して出力してる。

今後の予定

今後やりたい内容は以下の通り。

  • グラフ・インタフェイスについて
  • 辺や頂点への重みなどのつけ方:プロパティマップ
  • 各種グラフアルゴリズムの使用法

本日はここまで。