無向グラフの長さ制限のある単純なstパスの一部であるすべてのノードとエッジを含むサブグラフ


12

以前に投稿した質問とかなり似ています。ただし、今回はグラフは無向です。

与えられた

  • 無向グラフない複数のエッジまたはループを有します、G
  • ソース頂点、s
  • ターゲット頂点t
  • 最大の光路長l

私が探していGのサブグラフ-G任意の頂点と任意のエッジ含まGから少なくとも一つの単純なパスの一部である(とのみ)を、st長さl

ノート:

  • パスを列挙する必要はありません。
  • 非常に大きなグラフ(10 ^ 8頂点、10 ^ 9エッジ)で実行する必要があるため、効率的なアルゴリズム(時間とメモリの両方)を探しています。

これをチェックしてください。同様の最小コストフロー削減を行うと思われるが、ネットワークの特殊な特性を使用して一般的なMCFアルゴリズムよりも速く解決するこのペーパーを見つけました。
RB 14

回答:


6

まあ、問題は結局にあります。指示されたケース(他の質問で回答したNPC)でも機能するため、以前の回答を保持し、lに関してF P Tであることを示します。PFPTl

無向の場合、最小コストフローを介して決定論的に解決可能です(これは、質問で参照しているスケールでは機能しないかもしれませんが、指数アルゴリズムよりも優れています。

次の手順は、いくつかのエッジか否かを決定する出力グラフの一部であるべきです。元の問題に答えるには、すべてのエッジをループします。e=(u,v)E

フローネットワークを作成するには、次のようにします。

手順1:を展開して頂点x eを作成し、eをエッジu x ex eu v x ex ev )に置き換えます (これらはaフローネットワークの一部)、コストを0に設定します。exee(u,xe),(xe,u),(v,xe),(xe,v)

手順2:x eを除くすべての頂点を2つの頂点t およびt +で置き換え、エッジt t +を追加します。これらのエッジのコストを1に設定します。txett+(t,t+)

ステップ3:すべてのエッジ交換エッジを有する+B - ) B +- ) これらのエッジのコストを0に設定します。{a,b}E(a+,b),(b+,a)

ステップ4:新しい頂点を追加し、コスト0 のエッジs y et y eを追加します。ye(s,ye),(t,ye)

ステップ5:すべての容量を1に設定します。

次に、最小コストフローアルゴリズムを実行し、からy eへの値2のフローを検索します。xeye


分析:

  • すべての2値化フローY eは経路の和集合であるX ES Y E及び経路X ET Y Exeyexesyexetye
  • すべての頂点について、t t +アークには1つの容量しかないため、パスは互いに素です。t(t,t+)
  • 返されるパスは、距離の合計が最小の2つのパスです。これは、見つかったフローのコストでもあります。これにより、を出力グラフに追加したり、他の方法で削除したりできます。e

1
有向フローへの削減を取り除くことにより、上記の答えの議論を理解するのが簡単です。より単純パスが存在するためのtノードを含むVのパスがあるときに限りPからVパスのQからVするのtようにP及びQは、を除いて、ノードディスジョイントであるVが。これは決定的に無指向性を使用します。これはフローで確認でき、コストバージョンは最小コストフローでも確認できます。eを含むsからtへの単純なパスがあるかどうかを確認できます。stvPvsQvtPQvsteの途中にノードを導入することにより。e
チャンドラチェクリ14年

@ChandraChekuri -正しいのですが、問題は長さ制約を持っていない場合は、それを決定するための多くの単純なアルゴリズムがあることに注意してください- ここを参照してください
RB

確かに、私はその解決策も知っています-概念的には、切断されたパスとDFSを介して直接接続されたコンポーネントを見つけることができても、互いに素なパスを介して接続されたコンポーネントを理解することは良いことです。
チャンドラチェクリ14年

@RB:ありがとう。提案されたアルゴリズムは、lが比較的大きい場合に効果的かもしれませんが、おそらくlの比較的小さい値には最適ではありません。まず、sからfloor(l / 2)より遠くの頂点を削除し、tからceil(l / 2)を削除することにより、Gをトリムできると思います。
リオールコーガン14年

1
連続する最短パスアルゴリズム(ここで興味深い2つのパスの場合、Surballeのアルゴリズムとも呼ばれます)を適応してみてください。あなたはから最短2-パス見つけたい(それを呼び出すために優れているのyの代わりにY E、すべてにそれがすべてのエッジに対して同じであるため)のx E。これは、最初にyから最短パスツリーを計算し、次に注意して2番目のパス計算を実装することで効率的に実行できると思います。yyyexey
チャンドラチェクリ

1

ここで間違った答え:それはいくつかの非シンプルなパスの一部である頂点出力トンとされていないから、任意の単純パスの一部Sトン長さのℓを。答えはまだaskerのアプリケーションに関連している可能性があるため、ここに残しておきます。stst

これは時間で実行されるアルゴリズムです(実際、が小さい場合はこれより高速です)。O(|V|+|E|)

このアルゴリズムは、からBFS検索走る深さで終了することℓを。このBFSはセット与えるV Sから到達可能な全ての頂点のS最大で長さの経路とを、そしてそれはまた、距離が計算日間I S T V 毎にV V S。それから私はから同じことをしたいトンとセット入手Vのトンからとの距離をトン。最後に、探している頂点はまさにV s o l usVssdist(s,v)vVstVtt。エッジは、E[ V s o l u t i o n ]=vuVsolution={v:vVsVt,dist(s,v)+dist(t,v)}E[Vsolution])。=(v,u)E:u,vVsolution

このアルゴリズムの実行時間は、2つのBFSを実行するだけなので、確実にです。しかし、実行時間は実際にはO | V S | + | VのT | + | E [ V S ] | + | E [ VのT ] |グラフのサイズよりもはるかに小さいであろうℓの -radius stの近傍O(|V|+|E|)O(|Vs|+|Vt|+|E[Vs]|+|E[Vt]|)st 小さいです。

編集:からBFSを行い、実際にはやや速いアルゴリズムおそらくありますTの深さの唯一/ 2ではなくℓが。これにより、すべてのパスが検出されます。その後、ちょっとした記録で、すべての頂点を見つけることができます。これは、大規模ランダムに見えるグラフの場合の平方根で実行している時間を短縮ℓが小さいです。st/2


3
これは、パスを単純にすることを強制しません。単純なパスグラフおよびl = 4を考えます。あなたは戻りますVを経由する簡単な目のパスありませんが、出力の一部としてV ...tusvxl=4vv
RB

訂正@RBをありがとう。答えを編集して、間違っていることに注意しました。
メビウスdump子14

1

これはコメントとして意図されていますが、コメントとして投稿するには長すぎます。

また、目的に合わせてグラフスパナやエミュレータにも興味があるかもしれません。グラフG = V E スパナは、エッジがほとんどないサブグラフH = V E ')ですが、距離はほぼ保存されています。エミュレーターはグラフH = V E 'w であり、そのエッジに重みを付けることができます。G=(V,E)H=(V,E)H=(V,E,w)

The best result for spanners is O(n4/3) edges and an additive error of +6 on distance estimates in the graph. The best result for emulators is O(n4/3) edges and an additive error of +4. It is not known for either if we can beat O(n4/3), even if the error is allowed to be polylogarithmic.

If this sounds useful, I can try and dig up the relevant constructions for you.

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