web-dev-qa-db-ja.com

無向グラフで最短サイクルの長さを見つける

私は以下を試しました:

1)DFS、DFSツリーの各頂点のレベルを追跡する

2)バックエッジ(x、y)が見られるたびに、サイクル長= level [x]-level [y] + 1を計算し、最短よりも小さい場合は保存します

誰かがこのアプローチが間違っている反例を言うことができますか?

無向グラフで最短のサイクルを見つけるより良い方法は何でしょうか?

ありがとう。

18
Jake

DFSが機能しない理由

DFSを使用して最短の円を見つけることはできません。 DFSリードが最長の円のみを見つけるような反例を簡単に作成できます。次のグラフを見てみましょう。

A graph with a "long line"

ご覧のとおり、9つのノードがあります。左端のノードAから開始すると、次のDFSレベルが可能になる可能性があります。

Resulting depth first search tree

反復中に2つのバックエッジがあります。

  • (B , A)、したがって、長さ8の円が見つかりました
  • (D , A)、したがって、長さ8の円が見つかりました

ただし、最短の円の長さは5です。次の図では青色で示されていますが、以前に見つかった円の1つは赤色で示されています。

Long circle vs. short circle

DFSパスに青い円が含まれていないため、青い円は表示されませんでした。 Dagupaらはまた、彼らの本でこの振る舞いについて言及しています:

しかし、これは、DFSが最終的に実際に非常に近い頂点への長く複雑なルートをとることがあることも意味します。

BFSが機能しない理由

まあ、それは完全に真実ではありません。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)をチェックすることは有効なソリューションです。

23
Zeta

これはあなたが探しているものだと思います: http://webcourse.cs.technion.ac.il/234247/Winter2003-2004/ho/WCFiles/Girth.pdf

各ノードからBFSを作成するため、複雑さO(V * E)があります。

2
Labo

次のエッジを持つグラフがあるとします。

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)。

0
Fallen