セット頂点からセットへの最短経路を見つける方法


7

私がグラフ、頂点のサブセット、および頂点の2番目のセット持っている場合、 2セット?つまり、すべての -パスの中で最短のパスを探しています。すべてのエッジの重みが正であると仮定することもできます。G=(V,E)SVS(VS)SS

これが私がこれまでこの問題に取り組んだ方法です:

前の操作でフロイドワーシャルアルゴリズムを適用し計算されたグラフの距離行列情報がすでにあります。(d)G

次に、各頂点についてすべての頂点を反復処理し、行列最小値を持つペアを見つけます。SS(s1,s2)d

次にダイクストラのアルゴリズムを使用してと間の最短経路を計算し、頂点セットと接続します。s1s2SS

これと同じ結果を達成するためのより効率的な方法はありますか?

回答:


6

すべてのエッジ長が負でない場合、ダイクストラのアルゴリズムを1回呼び出すだけで時間で解決できます。O(|E|lg|V|)

新しい頂点追加して、グラフを少し修正します。また、長さ0のエッジをから各頂点に追加します。ssS

次に、ソース頂点から始めて、ダイクストラのアルゴリズムを実行します。ダイクストラのアルゴリズムは、から他のすべての頂点まで距離を計算します。つまり、すべてのを計算します。は、の頂点から頂点までの最短経路の長さと正確に一致することに注意してください。ssvd(s,v)vVd(s,v)Sv

最後に、計算します。これは、ある頂点からある頂点への最短経路の長さになります。それがあなたの答えです。min{d(s,v):vS}SS

Floyd-Warshallを実行する必要はありません。

ネガティブエッジを使用できる場合は、時間で実行できます。ダイクストラのアルゴリズムをベルマンフォードアルゴリズムに置き換えるだけです。O(|V||E|)


1
別の新しい頂点を追加することで、最小値の計算を節約することもできます。(実行時間の限界は想定していることに注意してください。これは妥当ですはおそらくここで接続されていると想定できます。)S|E|Ω(|V|)G
Raphael

あなたの答えをありがとう、それは非常に理にかなっています。Floyd-Warshallを実行する必要がないという点について、すでに何か他の目的でfloyd-warshallを実行していて、すでにその情報が利用可能な場合、距離グラフで検索する方が速くなりますか?か否か?とにかくdijkstraを実行する必要があるため、ダミー頂点メソッドを使用する方が速いのですか?
guskenny83

1
@ guskenny83、それは依存します。すでにFloyd-Warshallを実行している場合、その出力を使用して最短経路を見つけると、時間がかかり、行列内のすべてのエントリが検索されます。。セットとグラフのサイズに応じて、ダイクストラのアルゴリズムを実行するよりも遅くなる場合と速くなる場合があります。スパースグラフと大きなセット場合、最悪の場合は遅くなります。O(|S||S|)d[u,v]uS,vSS,SS,S
DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.