7.手書きによる高速解法

あるハミルトン閉路問題を与えられた時,いまやあなたはペンを取ってその問題を解くことができる.我々は手書きでハミルトン閉路を解くための多くの方法を考案し,それを試みた.ここでは,それらの中からもっともなじみのよい方法を3つ取り上げ紹介する.


A.N木による方法

N木とは,多元木をベースとしてグラフを表示するための図式である.グラフをN木に変換する手順は簡単である.まず任意の点を選んで木の根とする.次にその点から出る枝を木の枝としてその点に付け加え,枝の先に○で囲んだ点の記号を記入する.次にその枝の点から出る枝を追加してゆく.もし追加しようとしている枝の分岐先が既にN木上に存在する場合には点の記号のみを記入して○を省略する.このような枝を参照ないし参照枝と呼ぶ.(参照という言葉はプログラミングの用語から来ている)木の枝と参照枝を相互に交換することで,点を移動しN木を自由に変形することができる.

N木が作図できたら次に行なうべきことは難しくない.ゴールは木を変形して一本のリストを作ることである.一本のリストが出来上がればそれが求めるハミルトン閉路の一例である.一本のリストを作るための戦略としては出来るだけ枝を長く伸ばしてゆくというのがもっともわかりやすい.木の一番長い枝以外の余分の枝をカットし,下方の参照枝に移動する.場合によってはこの戦略だけではうまくゆかない場合もある.手詰まりになったら,もう一度根に戻って,試みていない木の枝と参照枝の交換を試みる.枝の先頭の点を自分の枝の下方にある参照に移動しようとすると,その枝が落下してしまうので厄介なことになる.このような場合にはまず,その点より下にある点をまず別の参照枝に移動し,2段階で移動するようにする.

出る枝を持っていない点がある場合はハミルトンタイを作ることはできない.すべての交換を試みて手詰まりとなれば,そのグラフはハミルトンタイを持っていない.「すべての交換を試みる」のであるとすれば,これは総当たりというのと異なるところは無いように思われるが,実際に作図を試みて欲しい.驚くほど高速な解法であることはすぐに了解されるだろう.例題としてあげているのは無向グラフだが,有向グラフの場合もまったく同様の手順で解くことができる.


B.2部グラフによる方法

有向グラフをそれと等価な2部グラフに変換することは簡単にできる.上の段と下の段には同じ記号をもった点が同数配置される.上の段が出力点,下の段が入力点である.枝は常に下向きの矢印として描かれる.2部グラフの上で行なう操作は枝の確定と削除である.枝が確定した時にはその枝をペンで太くするか,あるいは赤ペンを使って確定したことを示す.枝を削除したときにはその枝のどこかに−を付けて削除されたことを示すようにする.

この方法では,特に目標というものはない.まったく機械的に始めて機械的に完了する.グラフは連結であるという約束だから,枝の無い点というのは存在しない.しかし場合によっては,入力枝の無い点,あるいは出力枝の無い点がある場合がある.これらの点がある場合はハミルトンタイを持たないから,すでに終わっている.

次に分岐の無い一本だけの枝を探して確定する.(一本しかない枝を単独枝と呼ぶことにしよう.)次にこの確定した枝の入力点ないし出力点にある枝をすべて削除する.枝を削除すると新しく単独枝が発生する場合がある.ともかくこの操作を単独枝を持つ点が無くなるまで繰り返す.但し,残念ながら確定操作ではもうひとつのことを行なわなくてはならない.この操作がこの方法をときに間違いやすいものにしている.それは,確定した枝を含む路をループとして閉じる枝があれば削除しなくてはならないということである.例えば並列枝は必ずループを作るから,一方が確定したときには他方の枝はそれに伴って削除される.

この方法で許される操作は「枝の確定と削除」のみである.もはや確定すべき枝もないし削除できる枝も無い場合にはどうするか.ここであなたは任意の点のある枝を選んでその枝を確定することができる.あなたの選んだ枝を確定し,確定→削除→確定→削除を繰り返して,単独枝が無い状態に到達できれば,あなたの選択は(とりあえず)正しかったことになる.任意選択を何回か繰り返した後,あなたがハミルトンタイを得ることができればその選択は(完全に)正しかったと言うことができる.

間違っていた場合にはどうなるのか?その判定の方法は容易である.@枝を削除した結果,枝の無い点が発生した,A一つの点に単独枝が2つ存在する状態になった.もしこの2つのうちのいずれかが発生したとすればあなたの選択は間違っていた.あなたは任意選択した点に戻って別の枝を試みなくてはならない.間違った枝を選んでしまった場合は,おそらく2部グラフをもう一度新しく書き直してやり直したほうが解りやすいだろう.すべての出力点と入力点について確定枝が一本定まれば,その枝を順に連ねたものが求めるハミルトンタイである.もし,試みている点のすべての枝でデッドロックするなら(別の点を当たってみるまでもなく),このグラフはハミルトンタイを持っていない.

例題2では任意選択をまったく行なわずに初期局面で一意に解が定まってしまう.つまり,例題2のグラフはハミルトン閉路の解をひとつしかもっていない.無向グラフの場合も同様の方法で解くことができる.無向グラフの場合は,1本の無向枝に対し,2本の対向する有向枝があるとして同様に作図すればよい.


C.グラフの矢印を直接マークする方法

この方法はBの2部グラフによる方法と原理的には同じである.ただ,2部グラフを作図しないで与えられたグラフの矢印に直接「確定と削除」の印を書き込んでゆくところが異なるだけである.確定した枝の矢印は▼に塗り潰す.同様に削除された枝は矢印のやじりを−で結んで,▽のマークに変える.Bの場合と同様にループを閉じる枝を削除するのを見落とすことがあるので注意する必要がある.

やじりが枝の先についている場合には,むしろ枝に削除−,確定・などのしるしを付けた方が見易いかもしれない.2部グラフの方法と同様,この方法によってもハミルトン閉路の解をほんの2,3分で得ることができる.