完全グラフをGraphvizとPerlを使って書く方法

はじめに

前回は、完全2部グラフについて書いたんですが、今回は完全グラフについて書きました。[1]の和訳をこの前購入したんですが、
気に入った箇所があったので引用します。

あたらしい結果がもたらす光明を見逃さず、そこで用いられた手続をくりかえして利用すべきである。成功を探れ!その結果を、または方法を他の問題に利用できないか。

そこで、問いを変形して完全グラフの場合を考えることにしました。

ここで、ポイントとなるのが、「頂点の隣接関係の追記」の部分だけ変更すれば良いということです。

それ以外は、前回のコードをそのまま利用すればよいのです。

ここで私が書いたことを、応用して、

  • 任意の長さのパス
  • 任意の長さのサイクル
  • 任意の星グラフ

を生成するコードをサブルーチンの形で書いてもいいと思います。

完全グラフとは

完全グラフというのは、グラフ G=(V, E)の頂点集合 Vの任意の2点間に辺があるようなグラフのことを言います。 |V|=nとして、 K_{n}と表記します。

コード

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で完全グラフ K_{10}を描画した例


参考文献

  1. G. Polya, How to Solve It