Informatik

Graphenalgorithmus: Graphen modellieren und lösen

Graphenalgorithmus: Graphen modellieren und lösen
Graphenalgorithmus: Graphen modellieren und lösen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Ein Graphenalgorithmus untersucht ein Netz aus Knoten und Kanten. Welches Verfahren passt, hängt von deiner Frage ab: Möchtest du erreichbare Knoten finden, einen kürzesten Weg berechnen oder alle Knoten günstig verbinden?

Auf dieser Seite modellierst du ein kleines Netz, stellst es als Adjazenzliste und Adjazenzmatrix dar und führst ausgewählte Algorithmen schrittweise aus.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Vom Sachproblem zum Graphen

Ein Stadtplan, ein Computernetz oder eine Gruppe miteinander verbundener Personen kann als Graph dargestellt werden.

Definition

Graph

Ein Graph besteht aus einer Menge von Knoten und einer Menge von Kanten. Knoten stehen für Objekte. Kanten beschreiben Beziehungen oder Verbindungen zwischen ihnen.

Bei einem Straßennetz können Kreuzungen die Knoten und Straßen die Kanten sein. Ein Kantengewicht kann zusätzlich eine Entfernung, Fahrzeit oder andere Kosten angeben.

Du musst entscheiden, ob die Kanten eine Richtung haben:

  • Eine Straße, die in beide Richtungen befahrbar ist, kann in einem ungerichteten Straßennetz durch eine ungerichtete Kante modelliert werden.
  • Eine Einbahnstraße wird in einem gerichteten Straßennetz durch eine gerichtete Kante modelliert.
Beispiel

In einem gerichteten Verkehrsgraphen fährt ein Zug zwischen A und B in beide Richtungen. Dafür brauchst du die Kanten A nach B und B nach A. Von B nach C fährt dagegen nur ein Shuttle ohne Rückfahrt. Deshalb gibt es dort nur die Kante B nach C.

So bleibt die Bedeutung aller Kanten einheitlich: Jede gerichtete Kante gibt genau eine erlaubte Fahrtrichtung an.

Teste dich
Frage 1 von 2LeichtWelche Modellierung passt zu einer Einbahnstraße von P nach Q?
Lösung: Eine gerichtete Kante von P nach Q — Die Richtung gehört zur Kante, weil die Verbindung nur von P nach Q benutzt werden darf.
Frage 2 von 2MittelIn einem Wegenetz sollen Fahrzeiten berücksichtigt werden. Was wird zusätzlich benötigt?
Lösung: Ein Gewicht an jeder relevanten Kante — Die Fahrzeit wird als Kantengewicht gespeichert und kann dann von einem passenden Wegealgorithmus ausgewertet werden.
Den Graphen für Algorithmen darstellen

Ein Algorithmus benötigt eine systematische Darstellung der Nachbarschaften.

Definition

Adjazenzliste

Eine Adjazenzliste nennt für jeden Knoten seine Nachbarn. Bei einem gerichteten Graphen werden üblicherweise die direkt erreichbaren Nachfolger eingetragen.

Für den ungerichteten Graphen mit den Kanten A–B, A–C, B–D, C–D und D–E lautet die Adjazenzliste:

  • A: B, C
  • B: A, D
  • C: A, D
  • D: B, C, E
  • E: D

Weil der Graph ungerichtet ist, erscheint jede Verbindung bei beiden Endknoten.

Eine Adjazenzmatrix besitzt für jedes mögliche Knotenpaar ein Feld. Bei einem ungerichteten, ungewichteten Graphen steht dort 1, wenn eine Kante vorhanden ist, sonst 0.

ABCDE
A01100
B10010
C10010
D01101
E00010

Die Matrix ist symmetrisch: Steht bei D und E eine 1, steht auch bei E und D eine 1. Das liegt daran, dass die Kanten ungerichtet sind.

Eine Adjazenzmatrix benötigt Speicher für alle Knotenpaare. Eine Adjazenzliste benötigt dagegen im Wesentlichen Platz für die Knoten und vorhandenen Kanten.

Merke

Eine Adjazenzmatrix eignet sich für eine direkte Prüfung einzelner Kanten. Eine Adjazenzliste macht die vorhandenen Nachbarn eines Knotens schnell zugänglich und ist für dünne Graphen meist platzsparender.

Teste dich
Frage 1 von 2MittelWelche Zeile gehört zur Adjazenzliste des Beispielgraphen?
Lösung: C: A, D — In der Kantenmenge kommen für C genau die Kanten A–C und C–D vor.
Frage 2 von 2MittelWelche Einträge müssen wegen der ungerichteten Kante D–E beide den Wert 1 haben?
Lösung: Das Feld in Zeile D, Spalte E und das Feld in Zeile E, Spalte D — Eine ungerichtete Kante erscheint in der Adjazenzmatrix zweimal: einmal für D–E und einmal gespiegelt für E–D.
Mit BFS und DFS den Graphen durchsuchen

Eine Traversierung besucht die erreichbaren Knoten nach einer festgelegten Strategie. Wegen möglicher Zyklen wird jeder bereits entdeckte Knoten markiert.

Breitensuche

Die Breitensuche, kurz BFS, untersucht zuerst alle direkten Nachbarn und danach die weiter entfernten Knoten. Sie verwendet eine Schlange: zuerst eingefügt, zuerst entnommen.

Für eindeutige Ergebnisse betrachten wir Nachbarn alphabetisch. BFS startet bei A im Beispielgraphen:

  1. Markiere A und lege A in die Schlange.
  2. Entnimm A; entdecke B und C.
  3. Entnimm B; entdecke D.
  4. Entnimm C; D ist bereits entdeckt.
  5. Entnimm D; entdecke E.
  6. Entnimm E; die Suche ist beendet.

Die Besuchsreihenfolge lautet A, B, C, D, E. Die Entfernungen in Kanten von A betragen für A bis E der Reihe nach 0, 1, 1, 2, 3.

Merke

In einem ungewichteten Graphen liefert BFS die kleinste Anzahl von Kanten vom Start zu jedem erreichbaren Knoten.

Tiefensuche

Die Tiefensuche, kurz DFS, verfolgt einen Weg möglichst weit und kehrt erst dann zum letzten Knoten mit einem unbesuchten Nachbarn zurück. Sie kann rekursiv oder mit einem Stapel umgesetzt werden.

Mit alphabetischer Nachbarwahl besucht eine rekursive DFS denselben Graphen ab A in der Reihenfolge A, B, D, C, E. Die Reihenfolge unterscheidet sich von BFS, obwohl beide Verfahren dieselben erreichbaren Knoten finden.

Gut zu wissen

Eine Besuchsreihenfolge ist nur eindeutig, wenn auch die Reihenfolge der Nachbarn festgelegt ist. Eine andere zulässige Nachbarreihenfolge kann eine andere, ebenfalls korrekte DFS- oder BFS-Reihenfolge erzeugen.

Teste dich
Frage 1 von 4LeichtWelches Hilfsmittel gehört zur BFS?
Lösung: Eine Schlange — Die Schlange sorgt dafür, dass früher entdeckte Knoten vor später entdeckten Knoten bearbeitet werden.
Frage 2 von 4MittelWarum werden besuchte oder bereits entdeckte Knoten markiert?
Lösung: Damit Zyklen nicht zu endlosen Wiederholungen führen — Eine Markierung verhindert, dass derselbe Knoten durch einen Zyklus immer wieder neu bearbeitet wird.
Frage 3 von 4SchwerWelche Reihenfolge entsteht bei BFS ab A mit alphabetischer Nachbarwahl im Beispielgraphen?
Lösung: A, B, C, D, E — BFS besucht zuerst B und C in Abstand 1, danach D in Abstand 2 und schließlich E in Abstand 3.
Frage 4 von 4SchwerWelche Reihenfolge entsteht bei einer rekursiven DFS ab C, wenn Nachbarn alphabetisch gewählt werden?
Lösung: C, A, B, D, E — DFS startet bei C, folgt zuerst C–A, dann A–B und B–D möglichst weit. Von D wird E besucht, nachdem die bereits markierten Nachbarn übersprungen wurden.
Den passenden Wegealgorithmus wählen

Nicht jede Frage nach einem günstigen Weg kann mit demselben Verfahren gelöst werden.

VoraussetzungPassendes VerfahrenErgebnis
alle Kanten gleich bewertet oder ungewichtetBFSkleinste Kantenzahl vom Start
nichtnegative KantengewichteDijkstrakleinste Gesamtkosten vom Start
negative Einzelkanten möglichBellman–Fordkürzeste Wege und Prüfung auf erreichbare negative Zyklen

Dijkstra verwaltet für jeden Knoten eine vorläufige Distanz. In jedem Schritt wird ein noch nicht abgeschlossener Knoten mit kleinster Distanz gewählt. Anschließend wird geprüft, ob Wege über diesen Knoten bekannte Distanzen verbessern.

Beispiel

Der gewichtete, ungerichtete Graph besitzt die Kanten A–B mit Gewicht 2, A–C mit 5, B–C mit 1, B–D mit 2 und C–D mit 4.

Start ist A:

  1. A erhält Distanz 0, alle anderen zunächst unendlich.
  2. Über A erhält B die Distanz 2 und C die Distanz 5.
  3. B ist als Nächstes an der Reihe. Über B verbessert sich C auf 2 + 1 = 3. D erhält 2 + 2 = 4.
  4. Über C ergäbe sich für D 3 + 4 = 7. Das ist schlechter als 4, daher bleibt D unverändert.

Der kürzeste Weg von A nach D ist A–B–D mit Gesamtkosten 4. Die Vorgänger D ← B ← A ermöglichen die Rekonstruktion des Weges.

Merke

Dijkstra setzt nichtnegative Kantengewichte voraus. Bei negativen Einzelkanten ist Bellman–Ford eine mögliche Wahl; ein erreichbarer Zyklus mit negativem Gesamtgewicht verhindert einen endlichen kürzesten Weg.

Teste dich
Frage 1 von 2MittelEin ungewichteter Graph soll nach der kleinsten Kantenzahl von S aus untersucht werden. Welches Verfahren passt?
Lösung: BFS — BFS ordnet die erreichbaren Knoten schichtweise nach ihrer Entfernung in Kanten.
Frage 2 von 2SchwerEin Graph enthält eine negative Einzelkante. Warum darfst du Dijkstra nicht einfach anwenden?
Lösung: Seine Korrektheitsbegründung setzt nichtnegative Kantengewichte voraus. — Durch eine negative Kante kann ein später untersuchter Umweg eine bereits als endgültig behandelte Distanz noch verbessern.
Kürzester Weg oder minimaler Spannbaum?

Ein kürzester Weg verbindet einen Start mit einem Ziel möglichst günstig. Ein minimaler Spannbaum verfolgt ein anderes Ziel: Er verbindet alle Knoten eines zusammenhängenden, gewichteten Graphen mit minimalem Gesamtgewicht und ohne Zyklus.

Prim erweitert einen begonnenen Teilbaum wiederholt um eine günstigste Kante zu einem noch nicht enthaltenen Knoten. Kruskal betrachtet Kanten nach steigendem Gewicht und nimmt eine Kante nur auf, wenn kein Zyklus entsteht.

Beispiel

Im gewichteten Graphen aus dem Dijkstra-Beispiel wählt Kruskal zuerst B–C mit Gewicht 1. Danach können A–B und B–D mit Gewicht 2 aufgenommen werden.

Diese drei Kanten verbinden A, B, C und D ohne Zyklus. Ihr Gesamtgewicht ist 1 + 2 + 2 = 5.

Für den kürzesten Weg von A nach D waren dagegen nur die Kanten A–B und B–D wichtig. Der Wegealgorithmus und der Spannbaum beantworten also verschiedene Fragen.

Teste dich
Frage 1 von 2MittelEin Versorger möchte alle Orte mit möglichst geringer gesamter Leitungslänge verbinden. Was passt zum Ziel?
Lösung: Ein minimaler Spannbaum — Ein minimaler Spannbaum verbindet sämtliche Knoten und minimiert die Summe seiner ausgewählten Kantengewichte.
Frage 2 von 2SchwerWarum wird bei Kruskal eine Kante verworfen, wenn sie einen Zyklus erzeugt?
Lösung: Der Zyklus ist für die Verbindung aller Knoten nicht nötig und würde zusätzliche Kosten verursachen. — Ein Spannbaum soll alle Knoten mit einer zyklenfreien Kantenauswahl verbinden.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Graphenalgorithmus
    • Modellierung: Objekte werden Knoten, Beziehungen werden Kanten
    • Darstellung: Adjazenzliste oder Adjazenzmatrix
    • Traversierung: BFS sucht schichtweise, DFS sucht in die Tiefe
    • Kürzeste Wege: BFS ungewichtet, Dijkstra nichtnegative Gewichte, Bellman–Ford negative Einzelkanten
    • Vernetzung: Prim oder Kruskal erzeugen einen minimalen Spannbaum
    • Kontrolle: Voraussetzungen, Besuchsmarkierungen und Problemziel prüfen
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWas beschreibt eine Kante in einem Graphmodell?
Lösung: Eine Beziehung oder Verbindung zwischen zwei Knoten — Die Bedeutung einer Kante wird durch das Sachproblem festgelegt, etwa Straße, Datenleitung oder Abhängigkeit.
Frage 2 von 3MittelDu sollst alle von einem Startknoten erreichbaren Knoten schichtweise untersuchen. Was musst du dokumentieren?
Lösung: Schlange, Markierungen und Besuchsreihenfolge — Schlange und Markierungen machen jeden BFS-Schritt sowie die entstehende Reihenfolge nachvollziehbar.
Frage 3 von 3SchwerEin Netz hat ausschließlich nichtnegative Kantengewichte. Gesucht ist der günstigste Weg von A nach D, nicht die günstigste Verbindung aller Knoten. Welche Entscheidung ist begründet?
Lösung: Dijkstra verwenden und Distanz sowie Vorgänger jedes verbesserten Knotens festhalten — Problemziel und Gewichte sprechen für Dijkstra. Die Vorgängerangaben dienen anschließend zur Rekonstruktion des kürzesten Weges.

Prüfe dich zum Schluss: Kannst du bei einer neuen Aufgabe zuerst Knoten, Kanten, Richtung und Gewichte benennen und erst danach den passenden Algorithmus auswählen? Dann trennst du Modellierung, Voraussetzung und Verfahren sauber voneinander.

Passend dazu