回答:
単一の負のウェイトサイクルを見つけることが、最も高いウェイトサイクルを見つけるよりも簡単であることは、それほど驚くべきことではないと思います。ネガティブウェイトサイクルを見つけるように私に頼めば、私はどれでも見つけることができます。私が答えを主張するものをあなたに与えれば、頂点のシーケンスをチェックして、ウェイトが本当にネガティブであることを確認するのは非常に簡単です。しかし、最大重量サイクルは非常に特別なオブジェクトのように感じます。私はそれを見つけたと主張したとしても、もっと高いウェイトを持つ別のサイクルがないことをどのようにあなたに納得させますか?
一方、特定のサイクルの重みが少なくとも1または2または17であることを確認することも簡単であるため、この直感は役に立たないかもしれません...
これは素晴らしい質問です。完全に満足のいく説明はありませんが、それから始めましょう。
まず、すべてのサイクルを列挙してそれぞれの重みをチェックするだけではこの問題を解決できないことを理解することが重要です。何故なの?なぜなら、指数関数的に多くのサイクルが存在する可能性があるからです(そしてしばしばそうです)。したがって、それらを列挙するだけでは、必然的に指数関数的な時間がかかります。実行するには長すぎます。
では、ベルマンフォードはどのように機能するのでしょうか。これは、各サイクルを1つずつ個別に調べる必要を回避する巧妙なトリックによって機能します。代わりに、すべてのパスとまでの長さのサイクルの影響について何かを要約した要約を作成します。実際には、各頂点のために、それはで始まるすべてのパスまとめて、で終わり、および最大で取るのステップ。すべてのサイクルにはこの形式のパスが含まれている必要があるため、要約には、考えられるすべてのサイクルの影響が何らかの形でカプセル化されています。v v v n
これを使用して、重みのサイクルが存在するかどうかを(たとえば)検出できないのはなぜですか?これは、Bellman-Fordの要約に、サイクルを複数回歩くパスが含まれているためです。サイクルの長さが場合、サイクルの長さがパス、つまりサイクルを約回歩くパスが含まれます。たとえば、長さがサイクルがある場合、概要にはサイクルを3回歩くパスが含まれます。K N N / K N / 3
サイクルを複数回歩くことの効果は何ですか?正のウェイトのサイクルと正のウェイトのないサイクルを区別したい場合は、サイクルを何度も歩き回っても害はありません。サイクルに正の重みがある場合、そのサイクルを数回歩き回っても総重量は正になります。サイクルの重量が正ではない場合は、サイクルを数回歩くことができますが、総重量は依然として正ではありません。したがって、私たちが気にしているのは、正の体重と正でない体重の違いだけである場合、サイクルを複数回歩いても害はありません。
しかし、ここで重要なのが「重量」と「重量」の違いである場合に、物事がどのように変化するかを考えます。ウェイトがサイクルがあり、そのサイクルを複数回歩く場合、合計ウェイトはなる可能性があります。たとえば、サイクルの重みがで、サイクルを3回歩く場合、そのパスの総重みは、つまりです。重みサイクルで開始し、終了しました重みパスを使用します。この事実はベルマンフォードを完全に台無しにし、重量のサイクルがあるかどうかをチェックするのに役に立たなくします< 1 < 1 ≥ 1 1 / 2 1.5 ≥ 1 < 1 ≥ 1.5 ≥ 1。(違いがわかりますか?)
これは100%満足のいく答えではないことを理解しています。それはなぜベルマン・フォードがあなたの問題を解決するために働かないのかを教えてくれます。ただし、これが一般的に難しい理由を説明する直感はありません(たとえば、他のアルゴリズムを見つけて解決するのが難しい理由など)。私はそのための本当に良い直感を持っていません-多分誰かがあなたのためにより良い説明をするでしょう。それまでの間、この問題が難しい理由を理解するための第一歩になるかもしれません。
決定は、定数と整数のエッジの重みに対しては依然として簡単です。Iは、長さのすべてのサイクル確認することができに(単位重みを仮定して)。しかし、が定数でない場合、たとえばどうでしょうか?それはもはや多項式ではありません。C C O (N C)C 、C = N / 2
一方、一般的な決定問題(つまり、が一定でない場合)では、NP完全であるハミルトニアンサイクル問題を決定できます。
エッジが重み付けされていないこれらの問題のより単純なバージョンを考えてみましょう。
グラフ、に周期があるかどうかを確認します。G
グラフと数値与えられた場合、に少なくともの長さのサイクルがあるかどうかを確認します。k G k
最初の方法は簡単で、DFSを使用して解決できます。2つ目はNPハードです。
さらに簡単な問題を見てみましょう:
グラフと2つの頂点および与えられた場合、からへの単純なパスがあるかどうかを確認します。s t s t G
グラフ所与と2つの頂点とと数からの単純なパスがある場合、チェックににおける少なくとも長さの。s t k s t G k
これらの問題はすべて同じ味です。上の方は簡単ですが、下の方はNPハードです。前者の方が簡単なので、違いを説明しますが、他のペアにも同じことが言えます。
上が簡単で下が簡単ではないのは、これらの問題に対する回答の構造の結果です。
まず、単純なパスを見つける問題を見て、それを再帰的に解決してみましょう。この問題を直接解決しようとする場合は、これまでに使用した頂点を追跡する必要があります。
s t Gからパスがあるに対してにおける。
IFFまたはいくつかのためにおよび。
この単純な再帰アルゴリズムで問題を解決しようとすると、指数関数的な時間がかかり ます。未使用の頂点のセットには、指数関数的に多くの可能性があります。 私たちはもっと賢くならなければなりません。
なぜ私たちは指数関数的に多くの可能性を得たのですか?単純なパスを見つけてこの条件を適用しようとしたため、未使用の頂点を追跡する必要がありました。
では、その条件を削除して、どこで取得できるか見てみましょう。
からへのパス(単純である必要はありません)を見つける問題を考えます。パスは単純である必要はないため、未使用の頂点を追跡する必要はありません。つまり、グラフは時間の経過とともに変化しません。
からへのパスがあります。
IFF又は 一部のための、および。
しかし、まだ終わっていません。問題は、 がよりも小さい問題であるかどうかがわからないことです。したがって、この再帰的ソリューションはループで終了し、終了することはありません。
これを回避するには、問題が確実に小さくなるように、パスのエッジの数という追加のパラメーターを追加します。
からまでパスがあり、エッジは最大でです。
IFF及び又は、いくつかのためにおよび。
ここで、からまでパスがあり、からまでパスが最大エッジである単純なパスがあることに注意してください。言い換えると:
IFF。
ここでの重要なポイントは次のとおりです。
からへのすべての(自明ではない)単純 なパスは、からいくつかの頂点およびエッジへの単純なパスで構成されます。
がからへの単純なパスに表示されていないと想定できます。
未使用の頂点のリストを明示的に保持する必要はありません。
これらのプロパティを使用する と、単純なパスの問題の存在をスマートに再帰させることができます。
現在、これらは、少なくともの長さのパスを見つける問題には適用されません。 未使用の頂点のリストを保持せずに、少なくともの長さの単純なパスを見つける問題をより小さなサブ問題に削減する方法はわかりません。これらのプロパティにより、パス問題の存在を効率的に解決できます。
グラフに負のサイクルがない場合は、長さが最大でパスと最短の単純なパスの問題の存在を効率的に解くことができます。
しかし、それらは少なくともの長さのパスの存在を保持しません。つ頂点持つグラフを考えます。 。少なくとも長さの経路からへの含まと少なくとも長さの経路からへの含ま。したがって、未使用の頂点のリストを明示的に指定しないと、問題のインスタンスをより小さな問題のインスタンスに減らすことはできません。3 s 、u 、t w (s u )= 1000 、w (s t )= 1000 、w (u t )= 10 、w (t u )= 10 1001 s t u 1001 s u t
つまり、単純なパスの存在に対するスマートな再帰を知っている一方で、少なくとも問題の長さの単純なパスの存在に対するスマートな再帰はわかりません。
あなたの質問の最後の部分に戻って、あなたの議論には問題があります。
実際、長さサイクルの存在は、 任意の固定多項式時間で解くことができます(つまり、は入力の一部ではありません)。(重み付けされていないグラフが 時間で長さサイクルを持つかどうかを確認する方法と同様です。)k k k O (n k)
ただし、が入力の一部である場合、実行時間はに依存するため、これは保持されません。k