ベルマンフォードを使用して負のサイクルを取得


20

有向グラフで負のサイクルを見つけなければなりません。ベルマンフォードアルゴリズムの仕組みと、到達可能な負のサイクルがあるかどうかがわかります。ただし、明示的に名前を付けるわけではありません。

サイクルの実際のパスを取得するにはどうすればよいですか?v1,v2,vk,v1

標準アルゴリズムを適用した後、すでに回の反復を行っているため、それ以上の改善は不可能です。それでもノードまでの距離を短くできる場合は、負のサイクルが存在します。n1

私のアイデアは次のとおりです。パスを改善できるエッジと各ノードの先行ノードを知っているので、再びエッジに到達するまでそのエッジからさかのぼることができます。これでサイクルができました。

悲しいことに、これが正しいかどうかを伝える論文は見つかりませんでした。それで、実際にそのように機能しますか?

編集:この例は、私の考えが間違っていることを証明しています。次のグラフを考えると、ノードからBellman-Fordを実行します。1

ここに画像の説明を入力してください

エッジを順に処理します。回の反復の後、ノード距離を取得します:n 1a,b,c,dn1
2 30 3 151:5
2:30
3:15

そして親テーブル:親持ち親持ち親を持っている
3 2 3 3 213
23
32

今、実行反復目我々は、ノードの距離がわかり依然としてエッジ使用して改善することができる。したがって、負のサイクルが存在し、一部であることがわかります。1 a an1aa

しかし、親テーブルをさかのぼって追跡することにより、別の負のサイクル陥り再び会うことはありません。acda

この問題をどのように解決できますか?

回答:


14

あなたは大部分が正しい。もう1つ追加します。サイクルを見つけようとしているときに前のチェーンに戻ると、開始頂点か、これまでに見てきた前のチェーンですでに見られた他の頂点に到達すると停止します。基本的に、先行を使用して逆方向に移動するときにサイクルを検出すると、頂点を停止して出力します。v1

論文に関しては、単純なGoogle検索でXiuzhen Huang:Negative-Weight Cycle Algorithmsが得られます。ボーナスとして、ソース頂点から到達できない負の重みサイクルを見つけるための別のアルゴリズムもリストされてます。s


リンクが壊れています。
human.js


私はHuang教授のアイデアを使用しましたが、なぜ新しいソースノードと新しいターゲット(s'およびt')の両方を追加するのか理解できません。どんな長さのエッジでも既存のすべての頂点に接続されている新しいソースノードは、すべてのサイクルをアップさせるように思えました。
アブナッサー

0

あなたの例はあなたの考えと矛盾しません。確かに、負のサイクルを発見しました。あなたの例が示す考えは、ソース頂点は負のサイクルのノードではないかもしれないということだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.