最短経路問題
初期状態では各頂点にただ つの置物が置かれており,操作では つの頂点に置かれている置物を入れ替えるので,操作を何回行っても各頂点にただ つの置物が置かれていることは保たれます。
したがって,各頂点にただ つの置物が置かれている状態のみを考えます。
について頂点 に置物 が置かれている状態は, 文字目を とした文字列で表現することができます。
例えば, の場合で文字列 34567812
は,頂点 に置物 3
,頂点 に置物 4
,...,頂点 に置物 2
が置かれている状態を表現しています。
このような文字列 は, から までの数字の並べ方の数だけあり,全部で 通りあります。
また,入れ替えを行う操作は状態遷移であり,頂点 とその親 の置物を入れ替える操作は, の 文字目と 文字目の数字を入れ替えてできる文字列を としたときの, から への遷移に対応します。
よって, 通りの文字列 を頂点とし, 回の操作で遷移が可能な任意の つの文字列 に対し無向辺を張ったグラフを考えたとき,この問題は,数列 で定められる状態 から数列 で定められる状態 までの最短経路問題に帰着することができます。
頂点の数を ,辺の数を とすると計算量は幅優先探索なら ,ダイクストラ法なら です。
問題の制約より なのでどちらのアルゴリズムでも十分高速です。
各頂点の始点からの距離を記録するには連想配列を用いると実装しやすいです。
実装例(C++)