2010-10-26
Boost.Graphとグラフ理論の補足
発表とか、後のtwitterを見てて気になったことを書いておきます。
adjacency_listのコンストラクタ
発表資料では(エッジを格納したイテレータの最初、最後、頂点数)の3パラメータから成るコンストラクタを紹介しました。これは以下のコンストラクタです。
template <class EdgeIterator>
adjacency_list(EdgeIterator first, EdgeIterator last,
vertices_size_type n,
edges_size_type m = 0,
const GraphProperty& p = GraphProperty())
Creates a graph object with n vertices and with the edges specified in the edge list given by the range [first, last). The EdgeIterator must be a model of InputIterator. The value type of the EdgeIterator must be a std::pair, where the type in the pair is an integer type. The integers will correspond to vertices, and they must all fall in the range of [0, n).
http://www.boost.org/doc/libs/1_44_0/libs/graph/doc/adjacency_list.html
「nの部分の指定がエッジの頂点と一致しない場合はどうなるのか?」という質問がありましたが、まずnが多い場合は非連結のグラフが作られます。
グラフのノードは全て連結していなくてはならないというルールはありません。
極端な話、グラフの辺が空でも、頂点集合との組(V, φ)はグラフと言えます。
問題は、これらをどう使うか、ですね。
一方でnが小さい場合。これは上記引用部の注意に「辺は整数のペアで、その頂点を示す数字は0以上n未満の整数である必要がある」と明記してあります。
なので、この場合は動作を保証しない、あるいはn未満の頂点を指定した辺のみが有効になってグラフが作成される、という動きをすると思われます。
辺の定義
少しプレゼンテーション部分ではつぶれているので補足しておきます。
まず、有向・無向グラフに関わらず、辺は頂点の対によって表現されます。
これ以外の辺はありません。
(v1, v2, v3)は3つの頂点を結ぶ辺ではありません。
と、いうか三つ組みなので、これは辺になれないデータとなります。
そのため、家系図などは表現を考えなければグラフとしては表現出来ません。
これらの3つが繋がっていることは、例えば「(v1, v2), (v2, v3), (v3, v1)の3つの辺が全てあることの省略である」として記述するのであれば、それは許可されます。
こういった話をする場合、定義が大事に成ってくるわけです。
需要はあるのかな...?
ところでBoost.Graphとかグラフ理論とかの話は需要があるのでしょうか?
グラフ理論とかは結構Wikipediaに充実している気もしますが。
もし需要があるなら、まだまだBoost.Graphと戯れたいかなとも思う次第です。
Boost.勉強会#3関西に参加して発表してきました
Boost.勉強会#3関西に参加してきました。
http://kokucheese.com/event/index/4335/
当日の発表資料はこちら。
まあ、色の微調整とネタなどを仕込んだだけなんですけどね。事前資料との差異は。
勉強会参加の感想としては、楽しい異文化コミュニケーションをしてきたような感じでした。
いや、異文化過ぎて全く分からないもの*1もありましたが。
懇親会でも色々と面白い話が出来ました。
あとは、名刺を配りまくってたり、その場にいた魔導書著者の全員にサインを貰ったりとか、結構好きに動いてました。
スピーカーをやる事は自身の勉強のモチベーションに繋がるので非常に有効ですね。
自分のようなC++初心者(学生)でも発表は出来たので、その場に居たC++erな人やustで見てた人なんかもぜひ(勉強して)発表されてはどうでしょうか?
次は関東・関西以外にも、名古屋・北海道あたりでも開催の話がある模様ですので。
勉強会の後、自分の心が闇の軍団方向に進んでいくような気がしましたが、はてさて、今後どうなる事やら。
*1:プリプ○セッサとかD○語とか
