私は以下を試しました:
1)DFS、DFSツリーの各頂点のレベルを追跡する
2)バックエッジ(x、y)が見られるたびに、サイクル長= level [x]-level [y] + 1を計算し、最短よりも小さい場合は保存します
誰かがこのアプローチが間違っている反例を言うことができますか?
無向グラフで最短のサイクルを見つけるより良い方法は何でしょうか?
ありがとう。
DFSを使用して最短の円を見つけることはできません。 DFSリードが最長の円のみを見つけるような反例を簡単に作成できます。次のグラフを見てみましょう。
ご覧のとおり、9つのノードがあります。左端のノードA
から開始すると、次のDFSレベルが可能になる可能性があります。
反復中に2つのバックエッジがあります。
(B , A)
、したがって、長さ8の円が見つかりました(D , A)
、したがって、長さ8の円が見つかりましたただし、最短の円の長さは5です。次の図では青色で示されていますが、以前に見つかった円の1つは赤色で示されています。
DFSパスに青い円が含まれていないため、青い円は表示されませんでした。 Dagupaらはまた、彼らの本でこの振る舞いについて言及しています:
しかし、これは、DFSが最終的に実際に非常に近い頂点への長く複雑なルートをとることがあることも意味します。
まあ、それは完全に真実ではありません。BFSを使用することはできますが(次のサブセクションを参照)、式を使用することはできません。次のグラフを見てください。
このグラフにはまだ特別な絵はありません。 すべての「o」はノードです。 o --- o | | + ------- o --- o ------- + | | o ---- o ---- o ---- o ---- o
BFSで可能なレベルを見てみましょう。真ん中のノードから始めると、次のレベルになります。
5 ~~~ 5 ~~~はバックエッジです | | + ------- 4 ~~~ 4 ------- + | | 3 ---- 2 ---- 1 ---- 2 ---- 3
左のノードから始めると、次のレベルが得られます。
3 ~~~ 4 | | + ------- 2 --- 3 ------- + | | 1 ---- 2 ---- 3 ---- 4 ~~~~ 4
したがって、レベル式は使用できません。
効率的ではありませんが、全ペアの最短経路アルゴリズムを使用し、すべてのノードの距離(i、i)をチェックすることは有効なソリューションです。
これはあなたが探しているものだと思います: http://webcourse.cs.technion.ac.il/234247/Winter2003-2004/ho/WCFiles/Girth.pdf
各ノードからBFSを作成するため、複雑さO(V * E)があります。
次のエッジを持つグラフがあるとします。
1 <-> 4、4 <-> 2、4 <-> 3、2 <-> 3、3 <-> 1
次に、サイクル1、4、2、3、1を1、4、3、1の前にトラバースできます。DFSを検討しているため、2回アクセスされるノードはありません。したがって、1、4、2、3、1が最初にトラバースされる場合、1、4、3、1または4、2、3、3がトラバースされる可能性はまったくありません。したがって、DFSでは[〜#〜] not [〜#〜]を使用すると、常に最短のサイクルが得られることが保証されます。
可能な改善: BFSツリーはレベルごとに正常に機能し、BFSツリーのルートからノードまでの距離は、ノードが選択される順序に関係なく固定されています。ランタイム:変更されたフロイドワーシャルのアルゴリズムが最悪の場合O(V ^ 3)で実行される間、O(V + E)。