私の地元のスカッシュクラブには、次のように機能するはしごがあります。
- シーズンの初めに、クラブの各メンバーの名前を別々の行に並べた表を作成します。
- 次に、各名前の横に、勝ったゲームの数とプレイしたゲームの数を記入します(プレイヤーの勝ち/ゲームの形式で)。
したがって、シーズンの初めには、テーブルは次のようになります。
Carol 0/0
Billy 0/0
Alice 0/0
Daffyd 0/0
任意の2人のプレイヤーが試合をすることができ、1人のプレイヤーが勝ちます。テーブルの一番下に最も近いプレーヤーが勝った場合、プレーヤーの位置が切り替わります。その後、ステップ2を繰り返し、各プレイヤーの隣の勝ちとゲームの数を更新します。たとえば、アリスがビリーを破った場合、
Carol 0/0
Alice 1/1
Billy 0/1
Daffyd 0/0
これらの試合はシーズンを通して続き、最終的にはおおよその強さの順にリストされます。
残念ながら、更新はかなり偶然に行われるため、間違いが発生します。以下は無効なテーブルの例です。つまり、いくつかの開始順序(シーズンの初めに使用した順序を忘れてしまった)と一致と結果のシーケンスに対して上記の手順を正しく実行しても作成できなかったテーブルです。
Alice 0/1
Billy 1/1
Carol 0/1
Daffyd 0/0
Alice 2/3
Billy 0/1
Carol 0/0
Daffyd 0/0
Alice 1/1
Billy 0/2
Carol 2/2
Daffyd 0/1
テーブルが与えられた場合、それが有効かどうかをどのように効率的に判断できますか?以下に注意することから始めることができます。
元の開始順序を忘れているため、名前の順序は重要ではありません。
勝利の合計数は、プレイしたゲームの数の合計の半分でなければなりません。(これは、上記の最初の例が無効であることを示しています。)
- テーブルが有効であるとします。その後、マルチグラフがあります-複数のエッジを認めるがループは認めないグラフ-各頂点がプレイヤーに対応し、各エッジが試合に対応します。次に、各プレーヤーがプレイするゲームの総数は、マルチグラフ内のプレーヤーの頂点の度合いに対応します。したがって、適切な頂点角度を持つマルチグラフがない場合、テーブルは無効でなければなりません。たとえば、1次の1つの頂点と3次の1つの頂点を持つマルチグラフはないため、2番目の例は無効です。[このようなマルチグラフの存在を効率的に確認できます。]
したがって、最初に適用できるチェックは2つありますが、3番目の例のように、無効なテーブルは引き続き許可されます。このテーブルが無効であることを確認するには、逆方向に作業して、テーブルが発生する可能性のあるすべての方法を使い果たします。
この決定問題を解決する多項式時間(プレイヤー数とゲーム数)アルゴリズムを考えることができる人がいるかどうか疑問に思っていましたか?