これを最大フロー問題にすることができます。
は、私たちはN
でペア(方程式)の数を表すとします。
最初に、各ペアについて、3つの演算子があるため、最大で3つの結果が得られることに注意してください。
は、すべての方程式から、すべての可能な結果のセットを考慮し、二つの特別なノードs
(ソース)、t
を有するであろうグラフG
、(シンクを構築し、私たちはA
として数値のセットを示すものと)、1つのノードはA
の各要素に対応し、最後には数字の入力対の1つにつき1つのノードを含む。次のようにG
の
エッジが作成されます。
- エッジ
s
からA
に対応する各ノードに。
A
からそれぞれの結果を生成することができる数値の対に対応する各ノードにA
に対応する各ノードからのエッジが(各入力対が3つの異なる値を生成することができることに注意してください)。
- 各ノードからの式に対応するエッジは、シンク
t
になります。これらのエッジの各々すぐ1 に等しい容量へ
割り当て、最大フローアルゴリズムを実行します。フローの値がN
に等しい場合、N
異なる結果を生成することができます。
実際に、シンクに到着するN
のフローを持たせるには、レイヤー内のN
の式のそれぞれから1のフローを持つ必要があります。A
のどの数から各方程式の単位入力フローが得られるかを調べることで解を回復することもできます。
はEDIT:
は、以下の入力対のために、上記のアルゴリズムのための可視化の下に見る
3 1
2 2
2 1
セットA
が{2, 4, 3, 0, 1}
あります。いくつかの数字は複数のペアから取得できます。2 = 3 - 1 = 2 * 1
。これの効果は、番号2
に対応するノードが3 1
のノードと2 1
のノードの両方に接続されていることです。
すべての辺は単位容量(上記のとおり)を持っています。
t
にs
から最大フローアルゴリズムを実行した後、結果は、太字のエッジによって示され、このフローを提供する3
と1つの可能な方法です。この場合に生成される溶液は、2 = 3 - 1
,4 = 2 * 2
,1 = 2 - 1
である。
これまでに試したことがあるコードをいくつか見せてください。 – Matsmath
あなたは* [良い質問をする方法について読む](http://stackoverflow.com/help/how-to-ask)?そして、あなたは[最小、完全で、そして証明可能な例](http://stackoverflow.com/help/mcve)を作成する方法を知っていますか?そうでない場合は、リンクをたどって記事を読んでください。 –
私は最初にそのアルゴリズムを設計しようとしているので、私はコードを試していません。 –