有向グラフで単純なサイクルを見つける


15

私にとって、この問題は非常に興味深いようです。有向グラフで単純なサイクル(つまり、反復ノードではないサイクル)を見つけようとしていました。

私の解決策は次のようになっています。つまり、このグラフはケースの問題です。 ここに画像の説明を入力してください

深さ優先検索で「バックエッジ」を見つけることができるときにグラフにサイクルがあることを知っています(DFSTreeの私の写真で破線)、しばらくの間は数サイクルは確かですが、すべて、単純なサイクル。なぜなら、サイクルから非常に重要な指示されたegdes、つまり(0123)!=(0321)

私は、バックエッジを持つ各ノードのdfsを作成することを考えていますが、私にはわかりません、そしてそれは明確ではありません。それで、あなたが私を案内するかどうか、私はあなたに尋ねます。ありがとう!。 ここに画像の説明を入力してください

ここに私のケースの問題に対する単純なループのカウントがあります。

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


回答:


13

この質問は非常にグーグルのようです。たとえば、このペーパーに示されているアルゴリズムに興味があるかもしれません。

有向グラフのすべての基本回路を見つける。ドナルド・B・ジョンソン。SIAM J. COMPUT。巻 4、No。1、1975年3月

概要。で囲まれた時間と有界O((n + e)(c + 1))で空間の有向グラフのすべての基本回路を見つけるアルゴリズムが提示されます。ここで、グラフO(n + e)にはn頂点、eエッジ、およびc基本回路があります。このアルゴリズムは、TiernanとTarjanのアルゴリズムに似ていますが、出力シーケンスの1つの回路と次の回路の間の各エッジを最大2回考慮するため、より高速です。

論文には完全なアルゴリズムが含まれています。


OK。紙は完璧ですが、私は自分の仕事でどこにでも行くことができますか、それとも紙を見るだけですか?私はあなたにソリューションを紹介してくれましたが、私のアイデアで何を忘れていますか?
ジョナプリエート

2
主な問題は、dfsツリーが一意ではないことです(たとえば、図の「1」と「3」を入れ替える)。すべての可能なdfsツリーを見て、すべてのサイクルを列挙する必要があります。
バドロイト

1
このアルゴリズムのJava実装が必要な場合:github.com/1123/johnson
user152468

@badroitリンクが壊れています... :(
ホルヘE.エルナンデス

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