フロー分解定理(この max-flow の説明の§6.2 を参照)を使用すると便利な場合があります。この定理では、フローは一連のフロー パスとフロー サイクルに分解できるとされています。さらに、グラフ内のフロー パスとサイクルの総数は最大で m です。つまり、フロー サイクルを排除するための単純なアルゴリズムの 1 つは、グラフ内のすべてのフロー パスを見つけてから、フロー サイクルに対応する必要があるため、グラフ内の残りのフローをすべて削除することです。
フロー パスまたはサイクルを見つけるには、ソース ノードから単純な深さ優先検索を使用できます。ソース ノードから始めて、ターミナル ノードに到達するか、以前にアクセスしたノードにアクセスするまで、必要に応じてエッジをたどります。終点ノードにたどり着いた場合、たどったパスは単純なフロー パスです。いくつかのノードに 2 回遭遇した場合は、フロー サイクル (見つけたばかりのループによって形成された) を見つけたことになります。その後、グラフからフロー パス/サイクルを削除して繰り返すと、すべてのフロー パスとサイクルを検出することになります。ソース コードから流れを運ぶエッジがなくなったら、完了です。フロー パスを見つけるたびに、そのすべてのエッジを横切る合計フローを記録すると、フロー パスがなくなるまでこれを繰り返すことで循環フローをなくすことができます。
各 DFS には O(m + n) の時間がかかり、多くても O(m) のフロー パスがあるため、このステップの合計実行時間は O(m 2 + mn) であり、これはグラフのサイズの多項式です。
お役に立てれば!