Finde die kürzesten Wege in einem gewogenen unipathischen Graphen

12

Ein gerichteter Graph gilt als unipathisch, wenn es für zwei beliebige Eckpunkte u und v im Graph G=(V,E) höchstens einen einfachen Weg von u nach v .

Angenommen, ich habe einen unipathischen Graphen G so dass jede Kante ein positives oder negatives Gewicht hat, aber keine negativen Gewichtszyklen enthält.

Daraus möchte ich einen O(|V|) Algorithmus finden, der die kürzesten Wege zu allen Knoten von einem Quellknoten s .

Ich bin mir nicht sicher, wie ich dieses Problem angehen würde. Ich versuche zu sehen, wie ich die Tatsache nutzen kann, dass es keine negativen Gewichtszyklen und natürlich höchstens einen einfachen Pfad zwischen einem beliebigen Knoten u bis v .

gprime
quelle
1
Was hast du bisher versucht? Wenn Sie nicht weiterkommen, fangen Sie klein an: Wie sehen unipathische Diagramme wirklich aus? Zeichnen Sie beispielsweise jedes unipathische Diagramm mit einem Scheitelpunkt, zwei Scheitelpunkten, drei Scheitelpunkten usw. Möglicherweise finden Sie ein hilfreiches Muster. Außerdem erwähnen Sie, dass es keine negativen Gewichtszyklen gibt - kann es auch Zyklen (mit beliebigem Gewicht) geben?
Juho
@mrm An welches Muster denkst du? Unipathische Graphen können Zyklen haben, auf eine eingeschränkte Art und Weise, die ich nicht leicht ausdrücken kann.
Gilles 'SO - hör auf böse zu sein'
@mrm Nein. Eine Flanke kann höchstens einem Zyklus angehören. Ein Knoten kann zu einer beliebigen Anzahl von Zyklen gehören: Der Punkt-Stern-förmige Graph E = i n { ( a , b i ) , ( b i , a ) } ist unipathisch (und Sie können einen noch höheren erhalten Verhältnis der Elementarzyklen pro Knoten). nE=in{(a,bi),(bi,a)}
Gilles 'SO - hör auf böse zu sein'

Antworten:

10

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=01sst .(s=R[R[t]],,R[R[t]],R[t],t)

Durchqueren Sie die Grafik

Initialisiere auf alle - 1 .R1

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 .maabii,abi

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 GG{a1,,am}aGaiaGbi,aiGbbGa . Jeder Pfad in G ' induziert einen Pfad in G (wenn der Pfad b a c enthält , dann ersetzen Sie diesen durch b a ia i + 1a jc 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: # Ci,bGaiGGbacbaiai+1ajcGGGGG . 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=nmn1

Damit ist der Beweis abgeschlossen. Die Durchquerung folgt höchstens Kanten.2|V|2

Gilles 'SO - hör auf böse zu sein'
quelle