データ表現を選択する
まず、結果のサイズを見てください。から他のすべてのノードへの最短パスのコレクションが必要です。パスの平均長が定数で制限されていない限り(これはそうではありません:リストはunipathであり、sのルートを取得する場合、パスの合計長はn (n − 1 )/ 2です(nはリストの長さ)、データ表現に注意する必要があります。パスを含む構造は、パス間の共有を使用する必要があります。ssn(n−1)/2n
サイクルを除くと、から他のノードuへの単一のパスがあります。そのパスが中間ノードtを通過する場合、パスの最初のセグメントはsからtへの望ましいパスです。 sutst
から|までの番号が付けられたノードによってインデックス付けされた配列に結果を保存することを提案します。E | − 1、s = 0の場合。アレイストア内の各要素そのノードへの経路上で前のノードのインデックス(例えば、使用する- 1から到達不能なノードのための特別なマーカーとしてS)。経路Sにtがあろう(S = R [ ... R [ T ] ... ] 、... 、R [ R [ T0|E|−1s=0−1sst。(s=R[…R[t]…],…,R[R[t]],R[t],t)
グラフを走査する
をall − 1に初期化します。R−1
から始まるグラフの深さ優先または幅優先のトラバースを実行します。ノード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はI。maabi∀i,a⇆bi
ですから、もっと一生懸命働く必要があります。さて、帰納的に証明してみましょう。LET グラフ内のノードの数であるG、#E (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 1、… 、a m)を基本サイクルとします。#V(G)<nGnG0=#C(G)<#V(G)(a1,…,am)
サイクルを折りたたむ:、ノードがGマイナス{ a 1、… 、a m }プラスノードaであり、エッジがa iを含まないGのすべてのエッジであり、プラスa → G '、Bたび∃ I 、I → G、BとB → G 'たび∃ I 、B →G′G{a1,…,am}aGaia→G′b∃i,ai→Gbb→G′a。内のすべてのパス G "で誘導パス G(パスが含まれる場合は、B → A → C、それまでにこれを置き換える B → A I → A I + 1 → ... → J → Cで Gを)。したがって、 G 'は単発性です。でサイクルので、 Gはエッジを共有しない、 Gは"内のすべてのサイクルがある G我々は排除1を除いた:#C∃i,b→GaiG′Gb→a→cb→ai→ai+1→…→aj→cGG′GG′G。誘導によって、#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=n−m≤n−1
これで証明は終わりです。トラバーサルは最大続きます| V | − 2つのエッジ。2|V|−2