Wählen Sie eine Datendarstellung
Schauen Sie sich zunächst die Größe des Ergebnisses an. Sie möchten die Sammlung der kürzesten Pfade von zu jedem anderen Knoten. Sofern die durchschnittliche Länge eines Pfades nicht durch eine Konstante begrenzt ist (was nicht der Fall ist: Jede Liste ist ein Pfad, und wenn Sie die Wurzel für s nehmen, beträgt die Gesamtlänge der Pfade n ( n - 1 ) / 2, wobei n ist In Bezug auf die Länge der Liste müssen Sie in Ihrer Datendarstellung vorsichtig sein: Die Struktur, die die Pfade enthält, muss die gemeinsame Nutzung zwischen den Pfaden verwenden.ssn ( n - 1 ) / 2n
Mit Ausnahme von Zyklen gibt es einen einzelnen Pfad von zu einem beliebigen anderen Knoten u . Wenn dieser Pfad einen Zwischenknoten t durchläuft , ist das erste Segment des Pfads der gewünschte Pfad von s nach t . sutst
Ich schlage vor, das Ergebnis in einem Array zu speichern, das durch die von bis | nummerierten Knoten indiziert wird E | - 1 mit s = 0 . Jedes Element im Array speichert der Index des vorherigen Knotens auf dem Pfad zu diesem Knoten (zB verwenden - 1 als Marker für spezielle Knoten , die aus nicht erreichbar sind s ). Der Weg von s nach t ist ( s = R [ … R [ t ] … ] , … , R [ R [ t0| E|−1s=0−1sst .(s=R[…R[t]…],…,R[R[t]],R[t],t)
Durchqueren Sie die Grafik
Initialisiere auf alle - 1 .R−1
Führen Sie eine Tiefen- oder Breitendurchquerung des Graphen ausgehend von . Setzen Sie bei jedem Erreichen eines Knotens u R [ u ] auf seinen Vorgänger.suR[u]
Da es Zyklen gibt, kann ein Knoten mehr als einmal erreicht werden. Wenn bedeutet dies, dass u bereits besucht wurde.R[u]≠−1u
Beweisen Sie die Richtigkeit
Aufgrund der unipathischen Eigenschaft spielt es keine Rolle, wie wir jeden Knoten erreichen, solange wir keinen Zyklus abgeschlossen haben. Es gibt nur einen einfachen Weg.
Beweisen Sie die Komplexität
Der Algorithmus kann jeden Knoten mehr als einmal erreichen, so dass es nicht klar ist, dass seine Komplexität . Die geleistete Arbeit ist in der Tat Θ ( | E 0 | ), wobei V 0 die Kanten sind, die von der Quelle aus erreichbar sind. Genauer gesagt, wir erreichen einen Knoten nur in einem Fall mehr als einmal: Wenn der Knoten der erste ist, den wir in einem bestimmten Zyklus erreichen, und in diesem Fall erreichen wir ihn zweimal (einmal über einen einfachen Pfad und einmal nach Abschluss des Zyklus) ).O(|V|)Θ(|E0|)V0
Na dann. Beweisen wir, dass in einem unipathischen Graphen die Anzahl der Elementarzyklen höchstens linear mit der Anzahl der Knoten wächst. (Ein Elementarzyklus enthält keinen kürzeren Zyklus.) In der folgenden Diskussion gehe ich davon aus, dass der Graph keine Eigenkante hat (keine Kante von einem Knoten zu sich selbst; solche Kanten sind für die Pfadkonstruktion ohnehin irrelevant.) ).
Unipathische Graphen können Zyklen aufweisen, jedoch auf sehr eingeschränkte Weise. Es wäre schön, wenn wir jeden Zyklus irgendwie einem bestimmten Knoten zuordnen könnten (oder zumindest einer begrenzten Anzahl von Zyklen pro Knoten). Können sich Zyklen einen Knoten teilen? Leider ja.
Sie können Zyklen haben, die alle einen Knoten a und keine anderen Knoten teilen . Das resultierende Diagramm ist unipathisch. Bei Zyklen der Länge 2 ist dies ein Sternmuster mit einem zentralen Knoten a und einer beliebigen Anzahl von Knoten b i, so dass such i , a ⇆ b i .maabi∀i,a⇆bi
Wir müssen also härter arbeiten. Nun, versuchen wir es induktiv zu beweisen. Sei die Anzahl der Knoten in einem Graphen G , # E ( G ) die Anzahl der Kanten und # C ( G ) die Anzahl der Elementarzyklen, die keine Selbstkanten sind. Ich behaupte, wenn G unipathisch und nicht leer ist, dann ist # C ( G ) ≤ # V ( G ) - 1 .#V(G)G#E(G)#C(G)G#C(G)≤#V(G)−1
Für ein Diagramm mit einem oder zwei Knoten ist dies offensichtlich. Angenommen, die Behauptung gilt für alle Graphen, so dass und G sei ein unipathischer Graph mit n Knoten. Wenn G keinen Zyklus hat, ist 0 = # C ( G ) < # V ( G ) , Fall geschlossen. Ansonsten sei ( a 1 , … , a m ) ein Elementarzyklus.#V(G)<nGnG0=#C(G)<#V(G)(a1,…,am)
Reduziere den Zyklus: Sei der Graph, dessen Knoten diejenigen von G minus { a 1 , … , a m } plus einem Knoten a sind und dessen Kanten alle Kanten von G sind , an denen die a i ' s nicht beteiligt sind, plus a → G ' b , wenn ∃ i , a i → G b und b → G ' ein , wenn ∃ i , b →G′G{a1,…,am}aGaia→G′b∃i,ai→Gbb→G′a . Jeder Pfad in G ' induziert einen Pfad in G (wenn der Pfad b → a → c enthält , dann ersetzen Sie diesen durch b → a i → a i + 1 → … → a j → c in G ). Deshalb ist G ' unipathisch. Da die Zyklen in G keine Flanken teilen, hat G ' alle Zyklen in G mit Ausnahme derjenigen, die wir eliminiert haben: # C∃i,b→GaiG′Gb→a→cb→ai→ai+1→…→aj→cGG′GG′G . Durch Induktion ist # C ( G ' ) ≤ # V ( G ' ) - 1 . Da # V ( G ' ) = # V ( G ) - m + 1 ist , haben wir # 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
Damit ist der Beweis abgeschlossen. Die Durchquerung folgt höchstens Kanten.2|V|−2