Mathematisch ist ein Graph G eine beliebige Teilmenge der Produktmenge V x V mit V = beliebige Menge von Knoten. Ein Graph ist daher irgendeine Menge von Paaren der Form ( x, y ) mit x V und y V.
Beispiele:
V1 = Menge aller Flughäfen in Deutschland
G1 = { ( x, y ) V1 x V1 | Es
gibt einen Direktflug von x nach y }
V2 = Menge aller IA´s im 5. Semester
G2 = { ( x, y ) V2 x V2 | x
macht die OOP-Übungen zusammen mit y }
Darstellung:
Knoten V
Beispiel für einen Graphen:
V1 = { A,B,C,D,E,F,G,H }
G1 = { ( A, D ), ( D, A ), ( A, B ), ( B, C ), ( C, A ),
( B, E ), ( A, E ), ( F, G ), ( F, F ) }
Typen:
Graphen, die zu jedem Pfeil von x nach y auch einen Pfeil von y nach
x besitzen, heißen ungerichtete oder symmetrische Graphen. Statt
der beiden gerichteten Kanten ( Pfeile ) zeichnet man dann einfach eine
ungerichtete Kante.
Im Gegensatz zu den gerichteten Graphen wird für die Elemente ungerichteter
Graphen keine Ordnung verlangt. Die ungerichtete Kante von x nach y notiert
man durch { x, y }, den ungerichteten Graphen durch G2 = { {
x, y } }.
Graphen bei denen jeder Kante ein Wert zugeordnet ist, nennt man gewichtete oder bewertete Graphen. Dieser Kantenwert kann reell oder ganzzahlig sein.
Ein Graph, bei dem es zwischen je zwei ( verschiedenen ) Knoten einen
Weg gibt, heißt zusammenhängender Graph. Ein nicht zusammenhängender
Graph wird aus einer Vereinigung zusammenhängender Komponenten gebildet.
Ein zusammenhängender und zyklenfreier Graph ist ein Baum.
( Eine Gruppe nicht zusammenhängender Bäume ist ein
Wald. )
Jeder zusammenhängende Graph G besitzt einen erzeugenden Baum,
auch Spannbaum genannt. Der Spannbaum S ist ein zyklenfreier, zusammenhängender
Teilgraph von G. Daraus folgt, daß S auch Teilmenge von V x V ist.
Bei den meisten Graphen gibt es mehrere Möglichkeiten einen erzeugenden Baum zu konstruieren. Die Regel dafür lautet:
Warum ist der Spannbaum interessant?
Stellt man z.B. ein Rechnernetz als gewichteten Graphen dar,
könnte der Kantenwert die Kosten einer Leitung (Kante) zwischen Rechnern
(Knoten) angeben. Will man nun die niedrigsten Kosten für das Netz
in Erfahrung bringen, so sucht man den Spannbaum, bei dem die Summe der
Kosten seiner Kanten am geringsten ist (minimaler Spannbaum).
Bei nicht zusammenhängenden Graphen wird für jede Komponente ein Spannbaum gebildet. Alle Spannbäume zusammen bilden dann einen spannenden Wald.
boolean [] [] Graph ;
Voraussetzung ist dabei, daß die Knoten ( die Elemente von V )
irgendwie fortlaufend bezeichnet werden ( V also eine Aufzählung der
Knoten ist ). Bei n Knoten wird die n x n - Adjazenzmatrix definiert durch:
A( i, j ) =
Die Adjazenzmatrix für einen ungerichteten Graphen ist immer symmetrisch, d.h.: A( i, j ) = A( j, i ) für alle i, j V
Eine andere Möglichkeit einen Graphen darzustellen ist die Adjazenzliste. Dabei wird für jeden Knoten eine Liste definiert, in der die Adjazenz - knoten ( unmittelbare Nachbarn ) enthalten sind.
Liste oder Matrix ?
Die Darstellung als Liste vermeidet die speicheraufwendige ( und hochgradig
redundante ) Adjazenzmatrix und spart somit Speicherplatz. Dafür ist
der Aufwand für einen Zugriff auf den Wert einer Kante bei der Listendarstellung
hoch, während bei Verwendung der Matrix der Zugriff direkt möglich
ist.
Anwendung:
Viele klassische Beispiele für Graphen kommen aus dem Bereich der Verkehrsnetze. Deshalb haben wir zur Erläuterung der folgenden Algorithmen ein Beispiel aus diesem Bereich gewählt.
Wir haben eine Menge von Städten rund um die Bucht von San Francisco.
Die Kanten repräsentieren mögliche direkte Verkehrsverbindungen
(Straßen) zwischen den Städten. Sie sind mit einer Maßzahl
bewertet, die für die Entfernung und/oder den durchschnittlichen Zeitaufwand
für eine Fahrt zwischen den Städten steht. Jeder Knoten hat einen
Stadtnamen und eine Nummer in der Aufzählung.
Bei dieser Matrix sind die Einträge keine booleschen Werte mehr,
sondern entsprechen den Bewertungen der Kanten. Kein Wert ( - ) in der
Matrix bedeutet, es gibt keine direkte Verbindung zwischen den Städten.
Die Nullen in der Diagonalen sind die Bewertung jeder Stadt mit sich selbst.
Bei diesen Listen ist zu jedem Nachbarknoten außer der Nummer
auch der Wert der Kante, die ihn mit dem Anfangsknoten verbindet, in einer
Infokomponente gespeichert.