完全グラフをGraphvizとPerlを使って書く方法
はじめに
前回は、完全2部グラフについて書いたんですが、今回は完全グラフについて書きました。[1]の和訳をこの前購入したんですが、
気に入った箇所があったので引用します。
あたらしい結果がもたらす光明を見逃さず、そこで用いられた手続をくりかえして利用すべきである。成功を探れ!その結果を、または方法を他の問題に利用できないか。
そこで、問いを変形して完全グラフの場合を考えることにしました。
ここで、ポイントとなるのが、「頂点の隣接関係の追記」の部分だけ変更すれば良いということです。
それ以外は、前回のコードをそのまま利用すればよいのです。
ここで私が書いたことを、応用して、
- 任意の長さのパス
- 任意の長さのサイクル
- 任意の星グラフ
を生成するコードをサブルーチンの形で書いてもいいと思います。
完全グラフとは
完全グラフというのは、グラフの頂点集合の任意の2点間に辺があるようなグラフのことを言います。として、と表記します。
コード
use strict; use warnings; print "Input n.: "; my $n = <STDIN>; my $msg; my $msg2; open(FH, ">graph.dot"); $msg = <<"EOF1"; graph G { node [shape = "circle"]; size = "7.0, 7.0"; EOF1 #頂点の隣接関係をどんどん追記。 for(my $i = 1; $i <= $n; $i++){ for(my $j = $i; $j <= $n; $j++){ if($i != $j){ $msg2.= "$i -- $j;\n"; } } } $msg = $msg . $msg2 . "}"; print FH $msg; close(FH); exit;
Graphvizで完全グラフを描画した例
参考文献
- G. Polya, How to Solve It