場合によっては失敗する可能性がある貪欲なアルゴリズムには、ピア レビューが必要です。
ある長さのサイクルがある場合、次のことに注意してくださいk
。
1 -> 2 -> 3 -> ... -> k -> 1
単一の他のノードを導入することで、同じ長さの別のサイクルを作成できます。
1 -> 2 -> 3 -> ... -> k -> 1
k' -> 1 -> 2 -> ... -> k - 1 -> k'
または同じ長さのサイクル - 1:
1 -> 2 -> 3 -> ... -> k -> 1
k' -> 1 -> ... -> k - 2 -> k'
これは、常に新しいノードを導入し、最初の十分に大きなサイクルで他の 2 つのノードに接続することで、永遠に続く可能性があります。
したがって、無限の数のノードを使用できる場合は、必要な最大のサイクルから始めて、これを実行してください。
固定数のノードで作業する必要がある場合は、要求されたサイクルの構築に使用されるノードの数を最小限に抑えるよう努める必要があります。残りのノードは簡単に追加できるため、サイクルが形成されません。
再び最大のサイクルから始めます。
1 -> 2 -> ... -> k -> 1
これ以上ノードを追加しないことで、これから以下を取得できます。
k
長さ2
サイクル: 2 -> 1, 3 -> 2, ... 1 -> k
.
k - 2
長さ3
サイクル: 3 -> 1, 4 -> 2, ..., k -> k - 2
.
一般に、k - p + 1
長さp
のサイクル。
これらのいずれも、追加のサイクルを生成しません。したがって、アルゴリズム全体は次のようになります。
要求された最大のサイクルを構築します。
1.1。複数の最大の場合は、それぞれに 1 つの新しいノードを追加して、さらに構築します。これは、特定のサイズの新しいサイクルを取得するため、新しいノードを追加せずに大きなサイクルから小さなサイクルを構築するために説明した手順に影響することに注意してください。いくつかの重複があるため、ソリューションの数を単純に 2 倍にすることはできません。私が知る限り、それは数を1だけ増やします。
新しいノードを追加しないことで、より少ないサイクルを構築します。
必要なサイクルの構築が完了していない場合:
3.1. ノードが残っている場合は、それらを使用します。
3.2. ノードが残っていない場合は、出力しますno solution
。
構築サイクルが完了したら:
4.1. ノードが残っている場合は、リンクされたリストとしてどこかに追加して、邪魔にならないようにしてください。
4.2. ノードが残っていない場合は、完了です。