重み付きユニパシーグラフで最短経路を見つける


12

有向グラフは、グラフ任意の2つの頂点とに対して、からへの単純なパスが最大1つである場合、ユニパシーであると言われます。uvG=(V,E)uv

各エッジに正または負の重みがあり、負の重みサイクルが含まれていないような、ユニパスグラフが与えられたとします。G

これから、ソースノードからすべてのノードへのすべての最短パスを見つけるアルゴリズムを見つけたいです。O(|V|)s

私はこの問題にどのように取り組むのか分かりません。負のウェイトサイクルが含まれていないという事実と、もちろんノードからまでの最大1つの単純なパスをどのように使用できるかを確認しようとしています。uv


1
これまでに何を試しましたか?あなたが完全に立ち往生している場合、小さく始めましょう:ユニパシーグラフは実際にどのように見えますか?たとえば、1つの頂点、2つの頂点、3つの頂点などですべてのユニパシーグラフを描画します。役立つパターンを見つけることができます。さらに、負の重量サイクルはありませんが、(任意の重量の)サイクルさえ存在する可能性がありますか?
ジュホ

@mrmどのようなパターンを考えていますか?ユニパシーグラフは、表現が簡単な方法を見つけることができないという制約された方法で、サイクルを持つことができます。
ジル「SO-悪であるのをやめる」

@mrmいいえ。エッジは最大1つのサイクルに属することができます。:ノードはサイクルの任意の数に属することができ -pointed星状グラフE = I N { B IbがI} unipathicある(あなたがより高い得ることができノードあたりの基本サイクルの比率)。nE=in{(a,bi),(bi,a)}
ジル「SO-悪であるのをやめる」

回答:


10

データ表現を選択する

まず、結果のサイズを見てください。から他のすべてのノードへの最短パスのコレクションが必要です。パスの平均長が定数で制限されていない限り(これはそうではありません:リストはunipathであり、sのルートを取得する場合、パスの合計長はn n 1 / 2ですnはリストの長さ)、データ表現に注意する必要があります。パスを含む構造は、パス間の共有を使用する必要があります。ssn(n1)/2n

サイクルを除くと、から他のノードuへの単一のパスがあります。そのパスが中間ノードtを通過する場合、パスの最初のセグメントはsからtへの望ましいパスです。 sutst

から|までの番号が付けられたノードによってインデックス付けされた配列に結果を保存することを提案しますE | 1s = 0の場合。アレイストア内の各要素そのノードへの経路上で前のノードのインデックス(例えば、使用する- 1から到達不能なノードのための特別なマーカーとしてS)。経路StがあろうS = R [ ... R [ T ] ... ] ... R [ R [ T0|E|1s=01sst(s=R[R[t]],,R[R[t]],R[t],t)

グラフを走査する

をall 1に初期化します。R1

から始まるグラフの深さ優先または幅優先のトラバースを実行します。ノードuに到達するたびに、R [ u ]をその前身に設定します。suR[u]

サイクルがあるため、ノードに複数回到達する場合があります。持つあることを示し、uは、既に訪問されました。R[u]1u

正当性を証明する

unipathicプロパティのため、サイクルを完了していない限り、各ノードにどのように到達するかは関係ありません。単純なパスは1つだけです。

複雑さを証明する

アルゴリズムは各ノードに複数回到達する可能性があるため、その複雑さがであることは明らかではありません。実際に行われる作業は、Θ | E 0 |)です。ここで、V 0はソースから到達可能なエッジです。より正確には、1つの状況でノードに複数回到達します。ノードが特定のサイクルで最初に到達する場合、この場合は2回到達します(単純なパスから1回、サイクルの完了後に1回) )。O(|V|)Θ(|E0|)V0

じゃあ。ユニパシーグラフでは、基本サイクルの数がノードの数に比例して増加することを証明しましょう。(基本サイクルは、より短いサイクルを含まないサイクルです。)次の説明では、グラフには自己エッジがないと仮定します(ノードからそれ自体へのエッジはありません。 )。

ユニパシーグラフはサイクルを持つことができますが、非常に制約された方法です。何らかの方法で各サイクルを個別のノード(または少なくとも、ノードごとに最大で制限された数のサイクル)に関連付けることができれば便利です。サイクルはノードを共有できますか?残念ながらそうです。

1つのノードaをすべて共有し、他のノードを共有しないサイクルを持つことができます。結果のグラフはユニパシーです。長さ2のサイクルで、これは、中央ノードを有するスターパターンであり、Aおよび任意の数のノードB iのようにI bはImaabii,abi

ですから、もっと一生懸命働く必要があります。さて、帰納的に証明してみましょう。LET グラフ内のノードの数であるGE G のエッジの数とC G 自己エッジない基本サイクル数。Gがユニパシーで空でない場合、C G # V G 1であると断言します。#V(G)G#E(G)#C(G)G#C(G)#V(G)1

1つまたは2つのノードを持つグラフの場合、これは明らかです。アサーションは、そのすべてのグラフに当てはまると仮定およびlet Gを有するunipathicグラフであるN個のノード。Gにサイクルがない場合、0 = C G < V G 、ケースは閉じられます。それ以外の場合、a 1a m)を基本サイクルとします。#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

サイクルを折りたたむ:、ノードがGマイナス{ a 1a m }プラスノードaであり、エッジがa iを含まないGのすべてのエッジであり、プラスa G '、BたびI I G、BB G 'たびI B GG{a1,,am}aGaiaGbi,aiGbbGa。内のすべてのパス G "で誘導パス G(パスが含まれる場合は、B A C、それまでにこれを置き換える B A IA I + 1... JC Gを)。したがって、 G 'は単発性です。でサイクルので、 Gはエッジを共有しない、 Gは"内のすべてのサイクルがある G我々は排除1を除いた:Ci,bGaiGGbacbaiai+1ajcGGGGG。誘導によって、C G '#1 V G '- 1。ためV G '= V G - M + 1、我々はC G = C G '+を#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

これで証明は終わりです。トラバーサルは最大続きます| V | 2つのエッジ。2|V|2

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