以前に投稿した質問とかなり似ています。ただし、今回はグラフは無向です。
与えられた
- 無向グラフない複数のエッジまたはループを有します、
- ソース頂点、
- ターゲット頂点、
- 最大の光路長、
私が探していのサブグラフ-任意の頂点と任意のエッジ含まから少なくとも一つの単純なパスの一部である(とのみ)を、を長さ。
ノート:
- パスを列挙する必要はありません。
- 非常に大きなグラフ(10 ^ 8頂点、10 ^ 9エッジ)で実行する必要があるため、効率的なアルゴリズム(時間とメモリの両方)を探しています。
以前に投稿した質問とかなり似ています。ただし、今回はグラフは無向です。
与えられた
私が探していのサブグラフ-任意の頂点と任意のエッジ含まから少なくとも一つの単純なパスの一部である(とのみ)を、を長さ。
ノート:
回答:
まあ、問題は結局にあります。指示されたケース(他の質問で回答したNPC)でも機能するため、以前の回答を保持し、lに関してF P Tであることを示します。
無向の場合、最小コストフローを介して決定論的に解決可能です(これは、質問で参照しているスケールでは機能しないかもしれませんが、指数アルゴリズムよりも優れています。
次の手順は、いくつかのエッジか否かを決定する出力グラフの一部であるべきです。元の問題に答えるには、すべてのエッジをループします。
フローネットワークを作成するには、次のようにします。
手順1:を展開して頂点x eを作成し、eをエッジ(u 、x e)、(x e、u )、(v 、x e)、(x e、v )に置き換えます (これらはaフローネットワークの一部)、コストを0に設定します。
手順2:x eを除くすべての頂点を2つの頂点t −およびt +で置き換え、エッジ(t −、t +)を追加します。これらのエッジのコストを1に設定します。
ステップ3:すべてのエッジ交換エッジを有する(+、B - )、( B +、- )。 これらのエッジのコストを0に設定します。
ステップ4:新しい頂点を追加し、コスト0 のエッジ(s 、y e)、(t 、y e)を追加します。
ステップ5:すべての容量を1に設定します。
次に、最小コストフローアルゴリズムを実行し、からy eへの値2のフローを検索します。
分析:
ここで間違った答え:それはいくつかの非シンプルなパスの一部である頂点出力にトンとされていないから、任意の単純パスの一部Sにトン長さの≤ ℓを。答えはまだaskerのアプリケーションに関連している可能性があるため、ここに残しておきます。
これは時間で実行されるアルゴリズムです(実際、ℓが小さい場合はこれより高速です)。
このアルゴリズムは、からBFS検索走る深さで終了することℓを。このBFSはセット与えるV Sから到達可能な全ての頂点のS最大で長さの経路とをℓ、そしてそれはまた、距離が計算日間I S T (秒、V )毎にV ∈ V S。それから私はから同じことをしたいトンとセット入手Vのトンからとの距離をトン。最後に、探している頂点はまさにV s o l u。エッジは、E[ V s o l u t i o n ](=(v、u))。
このアルゴリズムの実行時間は、2つのBFSを実行するだけなので、確実にです。しかし、実行時間は実際にはO (| V S | + | VのT | + | E [ V S ] | + | E [ VのT ] |)グラフのサイズよりもはるかに小さいであろうℓの -radius sとtの近傍 小さいです。
編集:からBFSを行い、実際にはやや速いアルゴリズムおそらくありますとTの深さの唯一ℓ / 2ではなくℓが。これにより、すべてのパスが検出されます。その後、ちょっとした記録で、すべての頂点を見つけることができます。これは、大規模ランダムに見えるグラフの場合の平方根で実行している時間を短縮ℓが小さいです。
これはコメントとして意図されていますが、コメントとして投稿するには長すぎます。
また、目的に合わせてグラフスパナやエミュレータにも興味があるかもしれません。グラフG = (V 、E )のスパナは、エッジがほとんどないサブグラフH = (V 、E ')ですが、距離はほぼ保存されています。エミュレーターはグラフH = (V 、E '、w )であり、そのエッジに重みを付けることができます。
The best result for spanners is edges and an additive error of +6 on distance estimates in the graph. The best result for emulators is edges and an additive error of +4. It is not known for either if we can beat , even if the error is allowed to be polylogarithmic.
If this sounds useful, I can try and dig up the relevant constructions for you.