Grundlagen

Gewichtete und ungewichtete Graphen erklärt

Der Graph ändert sich nie; eine darübergelegte Funktion schon. Dieser Leitfaden verfolgt diese Funktion durch die zwei Bedeutungen von „kürzester Weg“, die drei Arten, wie sich Gewichte entlang eines Weges verknüpfen, den Algorithmus, den jede Gewichtsart erzwingt, und den genauen Punkt, an dem Dijkstra nicht mehr korrekt ist.

18 Min Lesezeit Aktualisiert: September 2026 Anfänger
Mohammed Islam Hadjoudj
Mohammed Islam Hadjoudj
Expert Operations Research Engineer

1. Ein Gewicht ist eine Funktion, kein Teil des Graphen

Ein Graph ist ein Paar von Mengen, G = (V, E), und nichts in dieser Definition erwähnt Zahlen. Entfernungen, Kosten, Kapazitäten und Dauern kommen von außen, als eigene Funktion auf derselben Kantenmenge:

G = (V, E)                    der Graph: welche Paare verbunden sind
w: E → ℝ                    die Gewichtsfunktion: was jede Verbindung kostet

Die Standardwerke trennen das bewusst. Bondy und Murty definieren einen gewichteten Graphen als Graphen zusammen mit einer Zuordnung einer reellen Zahl zu jeder Kante und definieren dann das Gewicht eines Teilgraphen als Summe seiner Kantengewichte, und genau das minimieren ein kürzester Weg oder ein minimaler Spannbaum. Diestel behandelt Gewichte ebenso, als zusätzliche Daten über einem unveränderten kombinatorischen Objekt.

Die Funktion w außerhalb des Graphen zu halten, ist keine Pedanterie, es bringt drei Dinge:

Ein ungewichteter Graph ist dann einfach ein Graph ohne eine solche Funktion, und der nächste Abschnitt zeigt, dass das dasselbe ist, wie die langweiligste Funktion überhaupt anzugeben.

2. Ungewichtet heißt: Jedes Gewicht ist 1

Am klarsten lassen sich beide Fälle zusammendenken, wenn man „ungewichtet“ nicht als Fehlen von Gewichten behandelt, sondern als eine bestimmte Wahl von Gewichten:

Ein ungewichteter Graph ist ein gewichteter Graph mit w(e) = 1 für jede Kante. Das Gewicht eines Weges ist dann seine Kantenzahl, also bedeutet „kürzester Weg“ „wenigste Kanten“.

Alles folgt aus dieser einen Ersetzung. Die Breitensuche, die den Weg mit den wenigsten Kanten findet, ist genau das, wozu der Dijkstra-Algorithmus entartet, wenn jedes Gewicht 1 ist: Die Prioritätswarteschlange muss nie etwas umordnen, weil die Distanzen ohnehin in nicht fallender ganzzahliger Reihenfolge herauskommen, und eine einfache FIFO-Warteschlange erledigt dieselbe Aufgabe in O(n + m). Edward Moores Arbeit „The shortest path through a maze“ von 1959 stellte und löste genau dieses Problem mit Einheitsgewichten und gilt meist als Ursprung des Algorithmus.

Die Ersetzung funktioniert auch in die andere Richtung, und dort zeigt sich, was Gewichte kosten. Geben Sie demselben Graphen beliebige positive Gewichte, und die FIFO-Warteschlange funktioniert nicht mehr, weil ein Weg mit mehr Kanten jetzt billiger sein kann. Sie brauchen eine Prioritätswarteschlange, und die Laufzeit steigt von O(n + m) auf O(m log n) mit einem binären Heap oder O(m + n log n) mit dem Fibonacci-Heap von Fredman und Tarjan (1987).

3. Der kürzeste Weg ist nicht der kürzeste Weg

Hier ist die ganze Unterscheidung in einem Bild. Dieselben fünf Knoten, dieselben fünf Kanten und dieselbe Frage liefern zwei verschiedene Antworten, je nachdem, ob die Zahlen da sind.

Zwei Kopien desselben Graphen mit fünf Knoten und den Kanten A zu B, B zu C, C zu D, A zu D und D zu E. Links ist der Graph ungewichtet, und die Breitensuche liefert den Weg von A nach D aus einer einzigen Kante. Rechts trägt derselbe Graph die Gewichte 1, 1, 1, 7 und 2, und Dijkstra liefert den Weg A nach B nach C nach D aus drei Kanten mit Gesamtkosten 3, während die einzelne Kante A nach D 7 kostet. Ein Feld darunter stellt die beiden Antworten gegenüber: wenigste Kanten ist eine Kante mit Kosten 7, geringstes Gewicht sind drei Kanten mit Kosten 3.
Wenigste Kanten und geringstes Gewicht sind verschiedene Ziele. Die einzelne Kante von A nach D ist im ungewichteten Graphen der kürzeste Weg und im gewichteten Graphen der schlechteste.

Ausgeschrieben lautet der Graph

V = {A, B, C, D, E}
E = { {A,B}, {B,C}, {C,D}, {A,D}, {D,E} }
w =    1       1       1       7       2

und die beiden Fragen haben diese Antworten:

FrageAlgorithmusGefundener WegKantenGesamtgewicht
Wenigste Kanten von A nach DBFSA → D17
Geringstes Gesamtgewicht von A nach DDijkstraA → B → C → D33
Wenigste Kanten von A nach EBFSA → D → E29
Geringstes Gesamtgewicht von A nach EDijkstraA → B → C → D → E45

Beachten Sie, dass die gewichtete Antwort in beiden Zeilen mehr Kanten verwendet. Das ist der Normalfall und kein konstruierter: Ein Umweg über die Autobahn hat mehr Kreuzungen und braucht weniger Minuten. Eine Breitensuche auf einem gewichteten Graphen liefert keine Näherung, sondern die Antwort auf eine andere Frage, und die Lücke zwischen beiden ist unbeschränkt. Erhöhen Sie das Gewicht von {A, D} auf eine Million, und die Breitensuche liefert die Kante trotzdem.

4. Was ein Gewicht bedeutet: drei Arten der Verknüpfung

„Gewichteter Graph“ ist ein Behälter, keine Bedeutung. Bevor Sie einen Algorithmus wählen, müssen Sie eine vorgelagerte Frage beantworten: Wie verknüpfen sich die Gewichte entlang eines Weges zu dem Wert, der Sie interessiert? Es gibt drei übliche Antworten, und sie führen zu drei verschiedenen Problemen.

Drei Felder mit demselben Weg aus drei Kanten mit den Gewichten 4, 2 und 6. Im additiven Feld ist der Wegwert die Summe, 12, beschriftet als Kosten, Entfernung oder Zeit und gelöst mit Dijkstra. Im Engpassfeld ist der Wert das Minimum, 2, beschriftet als Kapazität oder Bandbreite und gelöst mit einem Verfahren für breiteste Wege oder maximale Spannbäume. Im multiplikativen Feld sind die Gewichte die Wahrscheinlichkeiten 0,9, 0,8 und 0,5 mit dem Produkt 0,36, mit dem Hinweis, dass negative Logarithmen das Produkt in eine Summe verwandeln, sodass wieder Dijkstra anwendbar ist.
Dieselben drei Zahlen auf demselben Weg ergeben drei verschiedene Wegwerte. Welchen Sie wollen, entscheidet über den Algorithmus, bevor eine Zeile Code geschrieben ist.
VerknüpfungsregelGewicht bedeutetWegwertProblem und Verfahren
AdditivEntfernung, Kosten, Zeit, SprüngeSumme der KantenKürzester Weg: BFS, Dijkstra, Bellman-Ford
EngpassKapazität, Bandbreite, Zuverlässigkeit des schwächsten GliedsMinimale Kante auf dem WegBreitester Weg, auch Maximin- oder Minimax-Weg genannt; gelöst mit einem abgewandelten Dijkstra oder über einen maximalen Spannbaum
MultiplikativWahrscheinlichkeit, dass eine Verbindung funktioniert, ÜbertragungsratenProdukt der KantenWahrscheinlichster Weg: Setzen Sie -log w ein, und er wird additiv

Der multiplikative Trick verdient eine genauere Erklärung, weil er überall vorkommt, vom Routing bis zur Dekodierung natürlicher Sprache. Ein Produkt von Wahrscheinlichkeiten entlang eines Weges zu maximieren ist dasselbe, wie die Summe ihrer negativen Logarithmen zu minimieren, da -log streng monoton fallend ist und Produkte in Summen verwandelt. Da jede Wahrscheinlichkeit höchstens 1 ist, ist jedes -log w nichtnegativ, sodass Dijkstra direkt anwendbar ist und kein spezieller Algorithmus nötig ist.

Es gibt noch eine Unterscheidung, die mehr Modellierungsfehler verursacht als alles oben Genannte, und sie hat mit Arithmetik gar nichts zu tun:

Bedeutet eine größere Zahl näher oder weiter weg? In einem Distanzgraphen ist ein großes Gewicht schlecht, und man minimiert. In einem Ähnlichkeitsgraphen ist ein großes Gewicht gut, und man maximiert. Beides ist gegensätzlich, und das Dateiformat verrät Ihnen nicht, welches Sie vor sich haben.

Korrelationsnetzwerke, Mitkaufgraphen und Ähnlichkeitsgraphen aus Embeddings sind alle nach Ähnlichkeit gewichtet; wer sie an eine Kürzeste-Wege-Routine übergibt, berechnet also den Weg über die am wenigsten ähnlichen Verbindungen. Wenn Sie aus einer Ähnlichkeit eine Distanz brauchen, wandeln Sie bewusst um: d = 1 - s für eine Ähnlichkeit in [0, 1], oder d = 1/s, oder d = -log s. Jede Wahl ändert die Rangfolge der Wege, also ist sie eine Modellierungsentscheidung und keine Formalität.

5. Welchen Algorithmus die Gewichte für Sie wählen

Sobald die Verknüpfungsregel additiv ist, entscheidet allein die Form der Gewichtsfunktion über den Algorithmus. Das ist der praktische Kern der Unterscheidung zwischen gewichtet und ungewichtet.

GewichteVerfahrenZeitWarum
Alle gleich (ungewichtet)BFSO(n + m)Eine FIFO-Warteschlange liefert die Distanzen schon in nicht fallender Reihenfolge
Nur 0 und 10-1-BFS mit einer DequeO(n + m)Eine 0-Kante vorne einfügen, eine 1-Kante hinten, und die Deque bleibt sortiert
Kleine ganze Zahlen, beschränkt durch CDials Bucket-QueueO(m + nC)Buckets ersetzen den Heap, wenn der Wertebereich der Distanzen klein ist
Beliebig nichtnegativDijkstraO(m log n), oder O(m + n log n) mit einem Fibonacci-HeapDer gierige Abschlussschritt braucht nicht fallende Distanzen
Beliebig reell, kein negativer KreisBellman-FordO(nm)Jede Kante n-1 Mal zu relaxieren braucht keine Annahme über die Reihenfolge
Negative Kanten, alle PaareJohnson-AlgorithmusO(nm + n² log n)Einmal mit Bellman-Ford umgewichten, sodass jedes Gewicht nichtnegativ wird, dann Dijkstra von jedem Knoten aus

Zwei Einträge dieser Tabelle verdienen eine Anmerkung. 0-1-BFS beruht auf der schönen Beobachtung, dass man bei Gewichten von nur 0 oder 1 überhaupt keinen Heap braucht: Eine doppelseitige Warteschlange hält die Front kostenlos sortiert, und so erhält man lineare Zeit zurück. Der Johnson-Algorithmus aus seiner Arbeit von 1977 im Journal of the ACM ist der Standardweg, Dijkstras Geschwindigkeit auf Graphen mit negativen Kanten zu erhalten: Er fügt eine Potenzialfunktion hinzu, die jede umgewichtete Kante nichtnegativ macht und dabei erhält, welche Wege am kürzesten sind.

Es gibt auch ein bemerkenswertes Resultat an der Grenze zum ungewichteten Fall. Thorup zeigte 1999, dass kürzeste Wege von einer Quelle in einem ungerichteten Graphen mit positiven ganzzahligen Gewichten in linearer Zeit berechnet werden können, genauso schnell wie BFS, indem man die Struktur ganzzahliger Gewichte ausnutzt, statt Distanzen zu vergleichen. Für beliebige reelle Gewichte im Vergleichs-Additions-Modell ist kein vergleichbares Linearzeit-Resultat bekannt, was daran erinnert, dass „gewichtet“ kein einzelnes Problem ist, sondern eine Familie, deren Schwierigkeit davon abhängt, wie die Gewichte aussehen.

6. Negative Gewichte und warum Dijkstra scheitert

Dijkstras Notiz von 1959 setzte nichtnegative Gewichte voraus, und diese Annahme ist tragend, nicht dekorativ. Der Algorithmus ist gierig: Sobald er einen Knoten aus der Warteschlange nimmt, erklärt er ihn für abgeschlossen und betrachtet ihn nie wieder. Das ist nur korrekt, wenn kein später gefundener Weg billiger sein kann, und genau das garantiert Nichtnegativität, da das Verlängern eines Weges seine Kosten nur erhöhen kann.

Führen Sie eine einzige negative Kante ein, und die Garantie fällt. Hier ist ein Gegenbeispiel, klein genug, um es von Hand nachzuvollziehen, und frei von Gleichständen, sodass die Entnahmereihenfolge eindeutig ist:

Ein gerichteter Graph mit vier Knoten. S nach A kostet 1, A nach B kostet 1, S nach C kostet 3 und C nach B kostet minus 5. Dijkstra schließt die Knoten in der Reihenfolge S bei 0, A bei 1, B bei 2 und C bei 3 ab, legt B also bei 2 fest, bevor er den Bogen von C überhaupt betrachtet. Die wahre kürzeste Distanz zu B ist minus 2 über den Weg S nach C nach B. Ein Feld stellt die gierige Antwort 2 der richtigen Antwort minus 2 gegenüber.
Dijkstra schließt B bei 2 ab, während C noch in der Warteschlange ist. Der Bogen von C hat den Wert -5, also ist die wahre Distanz -2, aber B ist bereits abgeschlossen, und die Antwort wird nie korrigiert.

Verfolgen Sie es: Die Warteschlange entnimmt S bei 0 und relaxiert A auf 1 und C auf 3. Sie entnimmt A bei 1 und relaxiert B auf 2. Sie entnimmt B bei 2 und markiert es als abgeschlossen. Erst dann entnimmt sie C bei 3 und findet den Bogen C → B mit Gewicht -5, der B eine Distanz von -2 geben würde. Da B bereits abgeschlossen ist, wird die Verbesserung verworfen, und der Algorithmus meldet 2 statt -2.

Zwei Klarstellungen, die wichtiger sind als das Gegenbeispiel selbst:

Negative Gewichte sind nichts Exotisches. Arbitrageketten bewerten Währungsumrechnungen als Produkte, die zu Summen negativer Logarithmen werden, und ein profitabler Kreis erscheint im Modell als negativer Kreis. Das ist die Standardanwendung der Erkennung negativer Gewichte im Lehrbuch, und deshalb ist Bellman-Ford seinen zusätzlichen Faktor n wert.

7. Probleme, die es nur mit Gewichten gibt

Manche Fragen sind ohne Gewichte nicht schwerer, sondern leer. Der deutlichste Fall ist der minimale Spannbaum.

In einem ungewichteten zusammenhängenden Graphen hat jeder Spannbaum genau n - 1 Kanten, also ist jeder Spannbaum minimal, und jeder Durchlauf löst das Problem: Der BFS- oder DFS-Baum ist bereits eine Antwort. Fügen Sie Gewichte hinzu, und die Frage wird echt, weil Spannbäume nun verschiedene Gesamtkosten haben; den billigsten zu finden, gelang Borůvka 1926, Kruskal 1956 und Prim 1957 jeweils auf eigene Weise.

Im durchgehenden Beispiel nimmt der minimale Spannbaum die Kanten {A,B}, {B,C}, {C,D} und {D,E} mit Gesamtgewicht 5 und verwirft die teure Kante {A,D} mit 7. Ungewichtet wären alle vier Spannbäume dieses Graphen gleich gut.

ProblemUngewichtetGewichtet
Kürzester WegWenigste Kanten, BFS in O(n + m)Geringstes Gesamtgewicht, Dijkstra oder Bellman-Ford
Minimaler SpannbaumTrivial: Alle Spannbäume sind gleich gutDas eigentliche Problem: Kruskal, Prim, Borůvka
Maximaler FlussEinheitskapazitäten, ein SpezialfallDie Kapazitäten sind die Gewichte; das ganze Gebiet
MatchingMatching maximaler KardinalitätMatching maximalen Gewichts, ein anderer Algorithmus
Breitester WegBedeutungslosEngpass-Zielfunktion, Abschnitt 4
Clustering und Community-ErkennungBeruht auf dem Vorhandensein von KantenBeruht auf der Kantenstärke, was die gefundenen Communities ändert
ZentralitätAnzahlen von Wegen und NachbarnGewichtete Varianten; aus dem Grad wird die Stärke, Abschnitt 9

Der maximale Fluss ist das Spiegelbild des Spannbaum-Falls. Kapazitäten sind die Gewichtsfunktion, ein ungewichtetes Flussnetzwerk bedeutet also Einheitskapazitäten, und in diesem Spezialfall reduziert sich der maximale Fluss nach dem Satz von Menger auf das Zählen kantendisjunkter Wege. Ahuja, Magnanti und Orlins Network Flows ist das Standardwerk für die allgemeine gewichtete Behandlung, bei der jeder Bogen typischerweise eine Kapazität und Kosten trägt, also zwei Gewichtsfunktionen auf einem Graphen.

8. Gewichte speichern und die Falle „Null oder Unendlich“

Beide Standarddarstellungen lassen sich auf naheliegende Weise erweitern, und beide haben eine Fehlerquelle, die man benennen sollte.

Adjazenzmatrix. Statt 0 und 1 enthält der Eintrag (u, v) das Gewicht dieser Kante. Die Falle liegt auf der Hand: Was steht in den Zellen ohne Kante? Null ist der verlockende Standardwert und falsch, denn null ist ein völlig zulässiges Gewicht, und die beiden Fälle werden ununterscheidbar. Verwenden Sie für „keine Kante“ bei kürzesten Wegen, da das das neutrale Element der Minimierung ist, und lassen Sie 0 auf der Diagonalen. In einer ungewichteten Matrix bedeutet dieselbe Zelle mit dem Wert 0 „keine Kante“, und genau deshalb bricht Code, der von ungewichtet auf gewichtet portiert wird, an dieser Stelle.

ungewichtet       A[u][v] = 1 wenn verbunden, sonst 0
gewichtet         A[u][v] = w(u,v) wenn verbunden, sonst ∞      (0 auf der Diagonalen)

Sentinel-Bug      A[u][v] = 0 für „keine Kante“ macht eine Kante mit Gewicht 0
                  unsichtbar, und jede Distanz fällt auf 0 zusammen

Adjazenzliste. Jeder Eintrag wird zu einem Paar statt eines bloßen Knotens, die Liste enthält also (Nachbar, Gewicht). Sonst ändert sich nichts, und deshalb ist die Adjazenzliste der Standard für gewichtete Probleme: Der Speicheraufwand ist eine Zahl pro gespeicherter Kante, und die Durchlaufschleife ist identisch.

Ein drittes Format ist speziell für gewichtete Graphen wichtig. Die Kantenliste aus Tripeln (u, v, w) ist die natürliche Eingabe für den Kruskal-Algorithmus, der die ganze Liste nach Gewicht sortiert, und für Bellman-Ford, der jede Kante der Reihe nach relaxiert. Keiner von beiden braucht Nachbarschaftsabfragen, also braucht keiner überhaupt eine Adjazenzstruktur.

9. Aus dem Grad wird die Stärke

Gewichte ändern nicht nur Algorithmen, sondern auch beschreibende Kennzahlen. Das gewichtete Gegenstück zum Grad eines Knotens ist seine Stärke, die Summe der Gewichte seiner inzidenten Kanten:

deg(v)  =  Anzahl inzidenter Kanten          die ungewichtete Zählung
s(v)    =  ∑ w(e)  über Kanten an v           die gewichtete Summe

Barrat, Barthélemy, Pastor-Satorras und Vespignani führten den Begriff 2004 in ihrer PNAS-Arbeit über gewichtete Netzwerke ein, und er ist wichtig, weil beide Größen Knoten völlig unterschiedlich einstufen können. Ein Flughafen mit vielen winzigen Regionalstrecken hat hohen Grad und geringe Stärke; ein Drehkreuz mit vier riesigen Langstrecken hat geringen Grad und hohe Stärke. Die Frage „Welcher Flughafen ist der wichtigste?“ hat je nach berechneter Größe eine andere Antwort, und keine davon ist falsch.

Dieselbe Spaltung zieht sich durch die übrige Netzwerkanalyse. Newmans Arbeit „Analysis of weighted networks“ von 2004 zeigt, wie Clusterkoeffizienten, Modularität und Zentralität jeweils gewichtete Versionen erhalten und dass gewichtete und ungewichtete Versionen einer Kennzahl auf denselben Daten häufig nicht übereinstimmen. Wenn Sie eine Netzwerkkennzahl angeben, ist die Angabe, ob sie die Gewichte verwendet, keine Fußnote, sondern Teil der Definition.

10. Wann man Gewichte hinzufügt und wann nicht

Gewichte sind nicht umsonst. Sie kosten Linearzeit-Algorithmen, sie fügen bei jedem Schritt eine Modellierungsentscheidung hinzu, und sie bringen eine Skalenabhängigkeit mit, die ein ungewichteter Graph schlicht nicht hat. Greifen Sie zu ihnen, wenn die Antwort wirklich von Größenordnungen abhängt:

Zwei Warnungen speziell für gewichtete Daten. Erstens zählt die Skala: Multipliziert man jedes Gewicht mit einer positiven Konstanten, bleiben kürzeste Wege und minimale Spannbäume unverändert, da beide eine Summe minimieren, aber jede Kennzahl, die Gewichte mit einem absoluten Schwellenwert vergleicht, ändert sich, und ein negativer Faktor kehrt das Problem vollständig um. Zweitens müssen die Einheiten übereinstimmen , bevor Gewichte addiert werden. Minuten und Kilometer in einer Gewichtsfunktion zu mischen ergibt Zahlen, die kein Algorithmus interpretieren kann, und nichts im Code wird sich beschweren.

11. Häufige Fehler

12. Glossar

BegriffBedeutung
Gewichtsfunktion w: E → ℝOrdnet jeder Kante eine Zahl zu; nicht Teil von G = (V, E)
Ungewichteter GraphGleichwertig: ein gewichteter Graph mit w(e) = 1 überall
Gewicht eines WegesDie Summe seiner Kantengewichte, nach der additiven Konvention
Distanz d(u, v)Das minimale Gewicht über alle Wege von u nach v
EngpasswertDas minimale Kantengewicht entlang eines Weges; vom breitesten Weg maximiert
Negativer KreisEin Kreis mit negativem Gesamtgewicht; macht kürzeste Wege undefiniert
Stärke s(v)Die Summe der Gewichte der Kanten an v, der gewichtete Grad
Minimaler SpannbaumEin Spannbaum mit minimalem Gesamtgewicht; trivial im ungewichteten Fall
UmgewichtungVerschieben der Gewichte um ein Potenzial, sodass sie nichtnegativ werden, wie im Johnson-Algorithmus
SchwellenwertbildungAus einem gewichteten Graphen einen ungewichteten machen, indem man nur Kanten oberhalb eines Grenzwerts behält

13. Häufig gestellte Fragen

Was ist der Unterschied zwischen einem gewichteten und einem ungewichteten Graphen?

Ein gewichteter Graph trägt zusätzlich zum Graphen G = (V, E) eine Funktion w, die jeder Kante eine Zahl zuordnet. Ein ungewichteter Graph hat keine solche Funktion, was dasselbe ist, als hätte jede Kante das Gewicht 1. Die praktische Folge ist, dass „kürzester Weg“ im ungewichteten Fall wenigste Kanten und im gewichteten Fall geringstes Gesamtgewicht bedeutet, und das sind häufig verschiedene Wege.

Kann ich BFS auf einem gewichteten Graphen verwenden?

Ausführen können Sie sie, aber sie beantwortet eine andere Frage: Sie liefert den Weg mit den wenigsten Kanten und ignoriert die Gewichte vollständig. Das ist keine Näherung des Weges mit geringstem Gewicht, und die Lücke zwischen beiden ist unbeschränkt. Zwei Ausnahmen sind echt: Wenn alle Gewichte gleich sind, ist BFS korrekt und schneller als Dijkstra; und wenn die Gewichte nur 0 und 1 sind, liefert eine 0-1-BFS mit Deque die korrekte gewichtete Antwort in linearer Zeit.

Warum scheitert der Dijkstra-Algorithmus bei negativen Gewichten?

Weil er gierig ist: Wenn er einen Knoten aus der Prioritätswarteschlange nimmt, erklärt er dessen Distanz für endgültig und betrachtet ihn nie wieder. Das ist nur korrekt, wenn das Verlängern eines Weges seine Kosten nicht senken kann, und genau das garantieren nichtnegative Gewichte. Bei einer negativen Kante kann eine billigere Route auftauchen, nachdem der Knoten abgeschlossen wurde, und die Verbesserung wird verworfen. Abschnitt 6 zeigt ein Beispiel mit vier Knoten, bei dem Dijkstra 2 liefert und die wahre Distanz -2 ist. Verwenden Sie stattdessen Bellman-Ford oder für alle Paare den Johnson-Algorithmus.

Ist ein minimaler Spannbaum in einem ungewichteten Graphen sinnvoll?

Eigentlich nicht. Jeder Spannbaum eines zusammenhängenden Graphen mit n Knoten hat genau n-1 Kanten, bei gleichen Gewichten haben also alle dieselbe Summe, und jeder Spannbaum ist minimal. Jeder BFS- oder DFS-Durchlauf erzeugt bereits einen in linearer Zeit. Das Problem des minimalen Spannbaums wird erst interessant, wenn die Kanten verschiedene Kosten haben, und deshalb sind die Algorithmen von Kruskal und Prim ihrem Wesen nach gewichtete Algorithmen.

Ändern Gewichte, ob ein Graph zusammenhängend ist?

Nein. Zusammenhang, Bipartitheit, Planarität, Gradfolgen und Kreisstruktur sind allesamt Eigenschaften des Paares (V, E) allein, und die Gewichtsfunktion liegt außerhalb davon. Gewichte hinzuzufügen, zu entfernen oder zu skalieren kann keine davon ändern. Wenn eine gewichtete Berechnung einer strukturellen Tatsache zu widersprechen scheint, liegt der Fehler in der Gewichtung oder im Code, nicht in der Theorie.

Wie gehe ich mit Wahrscheinlichkeiten oder Ähnlichkeiten als Gewichten um?

Wandeln Sie sie zuerst in additive Kosten um. Bei Wahrscheinlichkeiten ist der Wert eines Weges das Produkt seiner Kanten, und ein Produkt zu maximieren ist dasselbe, wie die Summe negativer Logarithmen zu minimieren. Ersetzen Sie also w durch -log w und führen Sie Dijkstra aus: Jede Wahrscheinlichkeit ist höchstens 1, also ist jedes -log w nichtnegativ. Bei Ähnlichkeiten legen Sie ausdrücklich eine Distanz fest, etwa 1 - s, 1/s oder -log s. Wer rohe Ähnlichkeiten an eine Kürzeste-Wege-Routine übergibt, findet den Weg über die am wenigsten ähnlichen Verbindungen, und das ist fast nie gewollt.

14. Quellen

Die Definitionen, Algorithmen und Zuschreibungen oben stammen aus diesen Quellen, in chronologischer Reihenfolge.

  1. Borůvka, O. (1926). "O jistém problému minimálním" (Über ein gewisses Minimalproblem). Práce Moravské Přírodovědecké Společnosti 3, 37 bis 58. Der früheste Algorithmus für minimale Spannbäume.
  2. Kruskal, J. B. (1956). "On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem." Proceedings of the American Mathematical Society 7(1), 48 bis 50.
  3. Prim, R. C. (1957). "Shortest Connection Networks and Some Generalizations." Bell System Technical Journal 36(6), 1389 bis 1401.
  4. Bellman, R. (1958). "On a Routing Problem." Quarterly of Applied Mathematics 16(1), 87 bis 90. Kürzeste Wege, die negative Gewichte vertragen.
  5. Dijkstra, E. W. (1959). "A Note on Two Problems in Connexion with Graphs." Numerische Mathematik 1, 269 bis 271. Hier wird die Nichtnegativitätsannahme formuliert.
  6. Moore, E. F. (1959). "The Shortest Path Through a Maze." Proceedings of an International Symposium on the Theory of Switching, Teil II, 285 bis 292. Harvard University Press. Der Fall mit Einheitsgewichten, heute als BFS bekannt.
  7. Johnson, D. B. (1977). "Efficient Algorithms for Shortest Paths in Sparse Networks." Journal of the ACM 24(1), 1 bis 13. Umgewichtung zur Beseitigung negativer Kanten.
  8. Fredman, M. L. und Tarjan, R. E. (1987). "Fibonacci Heaps and Their Uses in Improved Network Optimization Algorithms." Journal of the ACM 34(3), 596 bis 615. Dijkstra in O(m + n log n).
  9. Ahuja, R. K., Magnanti, T. L. und Orlin, J. B. (1993). Network Flows: Theory, Algorithms, and Applications. Englewood Cliffs: Prentice Hall. Das Standardwerk zu Kapazitäten und Kosten als Gewichten.
  10. Thorup, M. (1999). "Undirected Single-Source Shortest Paths with Positive Integer Weights in Linear Time." Journal of the ACM 46(3), 362 bis 394.
  11. West, D. B. (2001). Introduction to Graph Theory, 2. Auflage. Upper Saddle River: Prentice Hall.
  12. Barrat, A., Barthélemy, M., Pastor-Satorras, R. und Vespignani, A. (2004). "The Architecture of Complex Weighted Networks." Proceedings of the National Academy of Sciences 101(11), 3747 bis 3752. Quelle der Knotenstärke.
  13. Newman, M. E. J. (2004). "Analysis of Weighted Networks." Physical Review E 70, 056131. Gewichtete Versionen der Standardkennzahlen für Netzwerke.
  14. Bondy, J. A. und Murty, U. S. R. (2008). Graph Theory. Graduate Texts in Mathematics 244. London: Springer. Quelle der Definition gewichteter Graphen in Abschnitt 1.
  15. Cormen, T. H., Leiserson, C. E., Rivest, R. L. und Stein, C. (2009). Introduction to Algorithms, 3. Auflage. Cambridge, Massachusetts: MIT Press.
  16. Diestel, R. (2017). Graph Theory, 5. Auflage. Graduate Texts in Mathematics 173. Berlin: Springer.

Ein Gewicht ändern und zusehen, wie der Weg wandert

Bauen Sie den Graphen aus Abschnitt 3, führen Sie Dijkstra aus, erhöhen Sie dann das Gewicht einer einzigen Kante und führen Sie ihn erneut aus. Zu sehen, wie die Route springt, ist mehr wert als jede noch so lange Lektüre darüber.

Visualisierer öffnen

Ein Gewicht ändern, den Weg verschieben

Bauen Sie den Graphen aus Abschnitt 3, führen Sie Dijkstra aus, erhöhen Sie dann das Gewicht einer einzigen Kante und führen Sie ihn erneut aus. Zu sehen, wie die Route springt, ist mehr wert als jede noch so lange Lektüre darüber.

Dijkstra-Visualisierer starten