ノードxとyの間のグラフに単純なパスが1つだけあるかどうかを確認します `


7

単純な無向グラフを与えたとしましょう G有するノードと双方向のエッジを。与えられたとについて、グラフの間に単純なパスが1つしかないかどうかを確認します。NMバツy

私が考えていたのは、グラフ内のすべてのサイクルを見つけて、から bfsを実行する必要があるということです。パスがあるサイクルの頂点を通過しない場合、パスは1つだけで、それ以外の場合はそこにあります。以上です。バツy

これを確認する他の方法はありますか?



似たような質問ですが、私の質問は1つ以上あるかどうかを確認するだけです。
someone12321 2017

@Eugene非常に似ていますが、もっと難しいと思います。
ラファエル

回答:


5

2最短経路を使用するというラファエルの提案は正しいですが、必要以上に複雑です。

あなたのアプローチは実行不可能であり、サイクル数は入力のサイズの要因です。

ここに時間内のソリューションのスケッチがあります O|V|+|E|

パスを見つける p1p から バツyO|V|+|E|。そのようなパスが存在しない場合は、答えてくださいNO。それ以外の場合は、パス内のすべてのノードをマークします。そのパス内のどのノードもその後のノードに到達しない場合に限り、そのパスは実際に一意です。パスの最初のノードから開始p1、出て行くランダムなエッジを選びます p1 それを接続するもの以外 p2そこからDFSを起動します。マークされたノードに到達したら、答えますNO、マークされたノードに到達しない場合は、グラフからその分岐を切り取り、別のランダムな出力エッジを選択します。すべての出力エッジがなくなるまで同様の方法で続行し、到達するまで次のノードから再度開始しますpn。答えずに手順を終えた場合NO、答える YES。手順全体にDFSのコストがかかります。O(|V|+|E|)、したがって、全体の時間は O(|V|+|E|)


「グラフからその枝を切り取る」と言うとき、トラバースしたすべてのエッジを削除することを意味しますか?これは、DFSの最後に一度に行うことはできません。これは、DFS自体で「戻る」途中で行われます。正しい?私は少し考えてそれを理解しましたが、もっと明確に説明できるかもしれません。
ワイルドカード2017

1
ラファエルの2つの答えのうち、あなたが言及しているのはどれですか。ああ、たぶんあなたの答えの前に投稿されたものではなく、後で投稿されたものでしょう。:-)明確にするために編集されました。
David Richerby 2017

@ワイルドカード:ええ、あなたは実際には何も「カット」しないでしょう、私がそれが私がやろうとしていることのアイデアを与えたと感じたので私はそのようにそれを書きましたが、実際の実装では、どういうわけかそれらのノードをDFS自体で訪れた。
クイックソート2017

2

実行したk最短経路とアルゴリズムをk=2 それが失敗するかどうかを観察します。


3
やりすぎではないですか。動的プログラミングはO(| V | + | E |)でそれを解決します
クイックソート

@quicksortああ、申し訳ありませんが、頭の中の最短経路についての質問に拡張しました。:D別の回答を追加してください!
ラファエル

2

ソースからのパスが存在する場合 x一部のサイクルでは、単一の単純なパスの存在と常に矛盾するわけではありません。次の例を見てください。 ここに画像の説明を入力してください

ここから到達できるサイクルがあります x そして y。この問題はO(|V|+|E|)

BFSを実行して、最短距離を見つけることができます x グラフ上のすべての頂点に、同じから y。1つのノードは最短パスに属していますxy もしそうなら

distance(x,u)+distance(u,y)=distance(x,y)
ここで、単一のパスがあるかどうかを確認するには、すべての距離で最短パスの有効なノードが1回だけ発生することを確認します。これは、最短パスに属するノードが少なくとも2つある場合xy 同じ距離で x次に、少なくとも2つの最短パスがあり、それ以外の場合は一意です。すべての後処理を行うことができますO(|V|)

ルックは、我々は2つの同じ距離のパスがある場合は持っている必要はありませんが、唯一の2つの異なるパスが存在するかどうかを確認するために
someone12321

両方のパスが最小の長さであると思った理由がわかりません。とにかく、私はあなたが上記の例が役に立つことをあなたが見つけてくれることを望みます、それはまだ続きます。
Marcelo Fornet

0

で始まる深さ優先検索を実行します xツリー、バック、クロスエッジのいずれであるかに応じて、エッジに注釈を付けます(例:ここを参照)。

から複数の単純なパスがあります xy からのパスに(少なくとも)1つのノードがある場合に限り xy バックエッジまたはクロスエッジに付随するツリーエッジ(DFSによって検出されたパス)のみを使用します。

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