Ein Graph ist in der Graphentheorie eine abstrakte Struktur, die eine Menge von Objekten zusammen mit den zwischen diesen Objekten bestehenden Verbindungen reprĂ€sentiert. Die mathematischen Abstraktionen der Objekte werden dabei Knoten (auch Ecken) des Graphen genannt. Die paarweisen Verbindungen zwischen Knoten heiĂen Kanten (manchmal auch Bögen). Die Kanten können gerichtet oder ungerichtet sein. HĂ€ufig werden Graphen anschaulich gezeichnet, indem die Knoten durch Punkte und die Kanten durch Linien dargestellt werden.[1]

In einem U-Bahn-Netz stellt jeder Knoten eine U-Bahn-Station dar und jede Kante eine direkte Zugverbindung zwischen zwei Stationen. Die chemische Graphentheorie betrachtet MolekĂŒle als Graphen, mit Atomen als Knoten und Molekularverbindungen als Kanten. Komplexe rĂ€umliche Gebilde wie Polyeder können als Graphen dargestellt werden (Schlegeldiagramm). Das Internet ist ein riesiger Graph aus Computern und Datenverbindungen.
BÀume wie etwa StammbÀume sind ein Sonderfall der Graphen und enthalten keine Zyklen.
Die mathematische Betrachtung von Graphen begann im 18. Jahrhundert mit dem Königsberger BrĂŒckenproblem.
Typen von Graphen
[Bearbeiten | Quelltext bearbeiten]Ungerichteter Graph
[Bearbeiten | Quelltext bearbeiten]In ungerichteten Graphen werden die Verbindungen zwischen Knoten durch Kanten gekennzeichnet. Die Kanten haben keine Richtung. Jede Kante kann in beide Richtungen durchlaufen werden.
Gerichteter Graph (Digraph)
[Bearbeiten | Quelltext bearbeiten]In Digraphen (von englisch directed graph, auch gerichtete Graphen genannt) werden Kanten statt durch Linien durch Pfeile gekennzeichnet, wobei der Pfeil von ihrem Anfangs- zu ihrem Endknoten zeigt. Dies verdeutlicht, dass jede Kante des Graphen nur in eine Richtung durchlaufen werden kann.[2] Ein Spezialfall davon sind orientierte Graphen, in denen es keine ungerichteten Kanten gibt, d. h. gibt es eine Kante von Knoten A nach B, dann gibt es nie auch die umgekehrte Kante von B nach A.
Baum
[Bearbeiten | Quelltext bearbeiten]Ein Baum ist in der Graphentheorie ein spezieller Typ von Graph, der zusammenhĂ€ngend ist und keine geschlossenen Pfade, also Zyklen der LĂ€nge gröĂer oder gleich 3, enthĂ€lt. Bei allen BĂ€umen ist die Anzahl der Knoten offensichtlich um 1 gröĂer als die Anzahl der Kanten.
BĂ€ume haben sehr viele praktische Anwendungen, vor allem in der Informatik. Viele Algorithmen werden mithilfe von BĂ€umen programmiert. Zum Beispiel können Netzwerke, Verkehrsnetze oder Versorgungsnetze mit einer Breitensuche oder einer Tiefensuche effektiv durchlaufen werden. Im Bereich der kĂŒnstlichen Intelligenz und der Strategiespiele ist die Alpha-Beta-Suche wichtig. Sie basiert auf SuchbĂ€umen.
Multigraph
[Bearbeiten | Quelltext bearbeiten]
In Multigraphen können zwei Knoten durch mehrere Kanten[3] verbunden sein, was in einfachen Graphen nicht erlaubt ist. AuĂerdem dĂŒrfen Multigraphen Schleifen enthalten: Kanten, die zum selben Knoten fĂŒhren, von dem sie ausgehen.[1]
Planarer Graph
[Bearbeiten | Quelltext bearbeiten]Ein planarer Graph ist ein Graph, der auf einer Ebene, mit Punkten fĂŒr die Knoten und Linien fĂŒr die Kanten, dargestellt werden kann, sodass sich keine Kanten schneiden. Jeder planare Graph hat einen dualen Graphen. Das ist ein Graph, wo jeder FlĂ€che des Graphen ein Knoten zugeordnet ist, der innerhalb dieser FlĂ€che liegt, und umgekehrt. Die DualitĂ€t von planaren Graphen ist immer gegenseitig, das heiĂt, der duale Graph des dualen Graphen jedes planaren Graphen ist der ursprĂŒngliche planare Graph.
FĂŒr planare Graphen gilt der Eulersche Polyedersatz, der oft mit der Gleichung dargestellt wird.
Hypergraph
[Bearbeiten | Quelltext bearbeiten]Bei Hypergraphen verbindet eine Kante (auch Hyperkante genannt) nicht nur zwei, sondern mehrere Knoten gleichzeitig. Hypergraphen können beispielsweise durch mehrere planare Graphen mit Indizierung der Kanten dargestellt werden. Hypergraphen mit wenigen Kanten (sogenannte dĂŒnne Graphen) zeichnet man so, dass man eine Menge von Punkten zeichnet, die den Knoten entsprechen, und die zu einer Hyperkante gehörigen Punkte werden dann durch eine geschlossene Linie umkreist, die somit die Teilmenge der zu ihr gehörenden Knoten innerhalb aller Knoten angibt. Bei Hypergraphen mit vielen Kanten wird diese Darstellung aber schnell unĂŒbersichtlich. Weniger intuitiv, aber ĂŒbersichtlicher ist es dann, einen Hypergraphen als bipartiten Meta-Graphen darzustellen, wobei die eine der beiden Bipartitionsmengen den Knoten des Hypergraphen, die andere Bipartitionsmenge den Hyperkanten des Hypergraphen entspricht. Die Kanten zwischen diesen beiden Bipartitionsmengen symbolisieren dann die Zugehörigkeit der Knoten zu den Hyperkanten.
Das Physik-Projekt von Stephen Wolfram (siehe auch: Wolfram Research und Mathematica) zur ErklĂ€rung der Grundlagen der Physik basiert unter anderem auf dem Raum der Regeln ĂŒber Hypergraphen: âUnd zumindest in einer gewissen AnnĂ€herung können wir dann sagen, dass Energie mit der AktivitĂ€t im Hypergraphen, die Information durch die Zeit fortpflanzt, assoziiert ist, wĂ€hrend Impuls mit AktivitĂ€t assoziiert ist, die Information im Raum fortpflanzt.â[4]
Definitionen
[Bearbeiten | Quelltext bearbeiten]Ein Graph ist ein geordnetes Paar , wobei eine Menge von Knoten (englisch vertex/vertices, oft auch Ecken genannt) und eine Menge von Kanten (englisch edge/edges, manchmal auch Bögen genannt) bezeichnet. Dabei ist in
- ungerichteten Graphen ohne Mehrfachkanten eine Teilmenge aller 2-elementigen Teilmengen von [1],
- gerichteten Graphen ohne Mehrfachkanten eine Teilmenge des kartesischen Produkts ,[5]
- ungerichteten Graphen mit zusammengefassten Mehrfachkanten eine Multimenge ĂŒber der Menge aller 2-elementigen Teilmengen von , also eine Funktion ,
- gerichteten Graphen mit zusammengefassten Mehrfachkanten eine Multimenge ĂŒber dem kartesischen Produkt , also eine Funktion ,
- gerichteten Graphen mit eigenstĂ€ndigen Mehrfachkanten eine beliebige Menge, deren Elemente mit Hilfe von zwei Funktionen , die den Elementen einen Quell- bzw. Zielknoten zuordnen, als Kanten angesehen werden (so ein Graph ist dasselbe wie ein Funktor , wobei die recht ĂŒberschaubare Kategorie mit zwei Objekten und zwei ausgezeichneten Pfeilen ist)
- Hypergraphen eine Teilmenge der Potenzmenge von .[1]
Mehrfachkanten |
Den Zusatz âohne Mehrfachkantenâ lĂ€sst man gewöhnlich weg und nennt Graphen mit Mehrfachkanten Multigraphen. Ferner verzichtet man meist auf das Attribut âungerichtetâ und kennzeichnet nur gerichtete Graphen explizit. Ungerichtete Graphen ohne Mehrfachkanten nennt man auch hĂ€ufig schlicht oder einfach. Eine andere Bezeichnung fĂŒr gerichtete Graphen ist Digraph (Directed Graph).
Abgeleitete Bezeichnungen
[Bearbeiten | Quelltext bearbeiten]Statt die Knoten- und Kantenmenge eines Graphen mit den Symbolen und zu identifizieren, kann man auch allgemeine Abbildungen und definieren, die einen Graphen auf dessen Knotenmenge oder Kantenmenge abbilden. FĂŒr zwei Graphen und bezeichnen also und sowie und .
Die Mehrdeutigkeit und wird bei dieser Notation in Kauf genommen, obwohl die Abbildungen etwas anderes darstellen als die mit ihr verbundene Knoten- und Kantenmenge. Als Konvention bietet sich an, mit bzw. ohne Argument Knoten- bzw. Kantenmenge zu bezeichnen, bzw. mit Argument bezeichnen dagegen die definierten Abbildungen.
Ist ein Graph, so sagt man allgemein ist Knoten bzw. Ecke von , wenn zu gehört. AuĂerdem bezeichnet man Kanten als
- ungerichtete Kante von , falls ein ungerichteter Graph ist.
- gerichtete Kante von , falls ein gerichteter Graph ist.
- Hyperkante von , falls ein Hypergraph ist.
In einer ungerichteten Kante bezeichnet man und als Endknoten von . In einer gerichteten Kante bezeichnet man als Startknoten und als Endknoten von .
Bei Multigraphen bezeichnet die Vielfachheit von . Wenn gilt, so spricht man von einer Multi- oder Mehrfachkante.
Hat eine Kante in gerichteten Graphen die Form , so spricht man von einer Schleife. Ist die Schleife in einem Multigraphen zugleich eine Mehrfachkante, so spricht man von einer Mehrfachschleife. Gerichtete Graphen ohne Schleifen nennt man schleifenlos oder schleifenfrei.
Als Knotenzahl eines Graphen bezeichnet man die Anzahl seiner Knoten, als Kantenzahl bezeichnet man die Anzahl seiner Kanten (in Multigraphen summiert man ĂŒber die Vielfachheit der Kanten).
Zwei Knoten heiĂen benachbart, wenn eine Kante sie verbindet.
SpezialfÀlle
[Bearbeiten | Quelltext bearbeiten]Verbindet in einem gerichteten Graphen die Kante zwei Knoten, und die Kante dieselben Knoten in umgekehrter Richtung, kann man beide zusammen auch als eine ungerichtete Kante innerhalb des gerichteten Graphen betrachten. Im Falle von Mehrfachkanten mĂŒssen die Vielfachheiten beider Kanten ĂŒbereinstimmen.
Gibt es zu jeder Kante eines gerichteten Graphen eine solche entgegengesetzte Kante im Graphen, so ist er ein symmetrischer Graph.
Einen Graphen, dessen Knotenmenge endlich ist, nennt man einen endlichen Graphen. Im Gegensatz dazu nennt man einen Graphen, dessen Knotenmenge unendlich ist, unendlichen Graphen. Meist betrachtet man nur endliche Graphen und lĂ€sst daher das Attribut âendlichâ weg, wĂ€hrend man unendliche Graphen explizit kennzeichnet.
Teilgraphen, Wege und Zyklen
[Bearbeiten | Quelltext bearbeiten]

Ein Teilgraph eines Graphen enthÀlt nur Knoten und Kanten, die auch in enthalten sind. Ein von einer Knotenmenge U induzierter Teilgraph enthÀlt die Knoten aus U und alle Kanten aus G zwischen diesen Knoten.
Eine Folge von paarweise verschiedenen Knoten , in der aufeinander folgende Knoten und im Graphen durch eine Kante verbunden sind, bezeichnet man als Weg, manchmal auch als Pfad. Gilt , und ist dies der einzige doppelte Knoten, spricht man von einem Zyklus oder Kreis. Eine Sequenz von benachbarten Knoten, in der sich Knoten wiederholen dĂŒrfen, bezeichnet man als Kantenfolge. Die Begriffe Weg, Pfad, Kantenfolge, Kreis und Zyklus werden in der Literatur zum Teil unterschiedlich definiert.
EnthĂ€lt ein gerichteter Graph keinen Zyklus, nennt man ihn azyklisch oder zyklenfrei â also einen gerichteten azyklischen Graphen (englisch DAG, directed acyclic graph). Ein solcher Graph lĂ€sst sich durch die ErgĂ€nzung aller Kanten, die gleichen Ausgangs- und Endknoten wie Wege haben, also die Umwege ĂŒber andere Kanten zu einem Zielknoten abkĂŒrzen, zu einer (endlichen und diskreten) Halbordnung erweitern. Diesen Vorgang nennt man die Bildung der transitiven HĂŒlle. Ein Hasse-Diagramm ist ein gerichteter azyklischer Graph, bei dem die durch das TransitivitĂ€tsgesetz implizierten Kanten weggelassen sind (transitive Reduktion).
Grundlegende Operationen
[Bearbeiten | Quelltext bearbeiten]Bei der Untersuchung von Grapheneigenschaften kommt es hĂ€ufiger vor, dass man auf Graphen einfache Operationen anwenden muss, um möglichst kompakt und damit leichter verstĂ€ndlich schreiben zu können. Besonders hĂ€ufig werden die ĂŒblichen Operationen der Mengenlehre (Vereinigung, Durchschnitt, Differenz und Komplement) auf Knoten- bzw. Kantenmengen von Graphen angewendet, sodass diese direkt auf Graphen definiert werden.
Sind und Graphen desselben Typs, so bezeichnet
- den Graphen, der entsteht, wenn man die Knoten- und Kantenmenge vereinigt,
- den Graphen, der entsteht, wenn man von der Kantenmenge von abzieht und
- den Graphen, der entsteht, wenn man von der Knotenmenge von abzieht und alle Kanten entfernt, die Knoten aus enthalten.
Man beachte dabei die unterschiedliche Definition der Begriffe Vereinigungsmenge und Differenzmenge fĂŒr Mengen und Multimengen. Man schreibt auch abkĂŒrzend
- , falls Teilmenge von ist,
- , falls leer oder Teilmenge von ist,
- , falls ,
- , falls ,
- , falls und
- falls .
Kantenkontraktion und die Bildung des Komplementgraphen sind weitere Basisoperationen.
Bemerkungen
[Bearbeiten | Quelltext bearbeiten]Ungerichtete Graphen ohne Mehrfachkanten sind SpezialfĂ€lle von Hypergraphen. Multigraphen, in denen keine Mehrfachkanten vorkommen, sind zwar nicht formal, aber anschaulich Ă€quivalent zu Graphen ohne Mehrfachkanten, weshalb man auch diese als Graphen ohne Mehrfachkanten bezeichnet. Es gibt eine bijektive Zuordnung zwischen den beiden Varianten. In diesem Sinne sind Graphen ohne Mehrfachkanten also SpezialfĂ€lle von Graphen mit Mehrfachkanten. Ăhnlich verhĂ€lt es sich mit ungerichteten Graphen, die in gewissem Sinn SpezialfĂ€lle von gerichteten Graphen sind. Ist ein gerichteter Graph symmetrisch und schleifenlos, so bezeichnet man diesen auch als ungerichtet, da es auch hier eine einfache eineindeutige Zuordnung zwischen beiden Varianten gibt (siehe auch Adjazenzmatrix).
Es lassen sich natĂŒrlich auch ungerichtete Graphen mit Schleifen definieren, wobei man diese wohl am einfachsten wie eben als (formale) SpezialfĂ€lle von gerichteten Graphen definiert und die Bedingung der Schleifenlosigkeit weg lĂ€sst. Solche Graphen sind aber nur selten Gegenstand der Betrachtungen in der Graphentheorie.
Der wohl allgemeinste Typ von Graphen sind gerichtete Hypergraphen mit Mehrfachkanten. Jeder oben definierte Graphentyp kann dann als Spezialfall von diesem betrachtet werden. Solche Graphen sind aber so gut wie gar nicht Gegenstand der Betrachtungen in der Graphentheorie, weshalb sie hier auch nicht nÀher erlÀutert werden.
Sollen Graphen als Darstellung eines Sachverhaltes herhalten, werden Algorithmen benötigt, die fĂŒr das Graphzeichnen benötigt werden. Diese Disziplin der Informatik hat sich in den letzten Jahren stets fortentwickelt und liefert Lösungen fĂŒr unterschiedliche Visualisierungen, die auf Graphen beruhen.
Erweiterungen
[Bearbeiten | Quelltext bearbeiten]Graphen können mit weiteren Eigenschaften bzw. Informationen ergÀnzt werden.
GefÀrbte Graphen
[Bearbeiten | Quelltext bearbeiten]Eine Erweiterung von Graphen zu knotengefĂ€rbten Graphen erhĂ€lt man, indem das Tupel zu einem Tripel ergĂ€nzt wird. ist eine Abbildung von in die Menge der natĂŒrlichen Zahlen. Anschaulich gibt man jedem Knoten damit eine Farbe.
Statt der Knoten kann man in Graphen ohne Mehrfachkanten und in Hypergraphen auch die Kanten fĂ€rben und spricht dann von einem kantengefĂ€rbten Graphen. Dazu erweitert man ebenfalls das Tupel zu einem Tripel , wobei aber eine Abbildung von (statt von ) in die Menge der natĂŒrlichen Zahlen ist. Anschaulich gibt man jeder Kante damit eine Farbe. In Graphen mit Mehrfachkanten ist dies zwar prinzipiell auch möglich, aber schwieriger zu definieren, insbesondere, wenn Mehrfachkanten entsprechend ihrer Vielfachheit mehrere verschiedene Farben zugeordnet werden sollen.
Man beachte, dass die Begriffe âFĂ€rbungâ und âfĂ€rbenâ in der Graphentheorie auch eine speziellere Bedeutung besitzen. Exakt spricht man dann zwar von gĂŒltiger FĂ€rbung, lĂ€sst das Attribut âgĂŒltigâ aber meist weg.
Analog gibt es auch benannte Graphen , bei denen Knoten und/oder Kanten einen Namen tragen, und die Abbildungen bzw. den Knoten bzw. Kanten einen Namen zuordnen. Die zuvor abgebildeten Beispiele sind benannte Graphen, bei denen die Knoten mit Buchstaben benannt wurden. Dies wird oft bei Visualisierungen gemacht, so dass man besser ĂŒber den Graphen diskutieren kann.
Gewichtete Graphen
[Bearbeiten | Quelltext bearbeiten]Statt von knoten- bzw. kantengefĂ€rbten Graphen spricht man von knoten- bzw. kantengewichteten Graphen, falls statt in die natĂŒrlichen Zahlen in die reellen Zahlen abbildet. Knoten- bzw. kantengefĂ€rbte Graphen sind also SpezialfĂ€lle von knoten- bzw. kantengewichteten Graphen.
Man bezeichnet bzw. auch als Gewicht des Knotens bzw. der Kante . Zur Unterscheidung spricht man auch von Knotengewicht bzw. Kantengewicht. Eine solche Gewichtung wird erforderlich, wenn die Information ĂŒber Knotenbeziehungen nicht ausreicht. Fasst man beispielsweise das StraĂennetz (vereinfacht) als Graph auf (Orte sind Knoten, die Orte verbindende StraĂen sind Kanten), so könnte eine Gewichtung der Kanten Aufschluss ĂŒber die Distanz zwischen zwei Orten geben. Die Kantengewichte eines Graphen können in einer quadratischen Gewichtsmatrix, der Adjazenzmatrix, gesammelt werden.
Abbildungen zwischen Graphen
[Bearbeiten | Quelltext bearbeiten]SchlieĂlich lassen sich auch Abbildungen zwischen Graphen definieren. Interessant sind insbesondere solche, die mit der Struktur der beiden vertrĂ€glich sind, so genannte âHomomorphismenâ.
Seien dazu und Graphen desselben Typs. Eine Abbildung heiĂt Homomorphismus zwischen und , falls gilt:
- In ungerichteten Graphen ohne Mehrfachkanten:
Ist eine Kante von , so ist eine Kante von . - In gerichteten Graphen ohne Mehrfachkanten:
Ist Kante von , dann ist Kante von . - In ungerichteten Graphen mit Mehrfachkanten:
, d. h. je zwei Ecken sind mit höchstens so vielen Kanten verbunden wie ihre Bildecken. - In gerichteten Graphen mit Mehrfachkanten:
. - In gerichteten Graphen mit eigenstÀndigen Mehrfachkanten:
hat einen dazugehörenden Partner und fĂŒr alle Kanten gilt sowie (werden und als Funktoren angesehen, ist ein Graphhomomorphismus gerade eine natĂŒrliche Transformation). - In Hypergraphen:
Ist Kante von , so ist Kante von .
Das Bild p(G1) ist dann ein Teilgraph von G2. Ist p umkehrbar und die Umkehrfunktion ebenfalls ein Homomorphismus, so ist p ein Isomorphismus von Graphen.
Zu beachten ist, dass die Knoten vor den Kanten einen Vorrang haben, indem p als Funktion nur auf den Knoten spezifiziert ist, die auf den Kanten lediglich eine induzierte Wirkung entfaltet.
Kombinatorik
[Bearbeiten | Quelltext bearbeiten]Die Anzahl der einfachen ungerichteten Graphen mit Knoten steigt rasant mit der Anzahl der Knoten und ist gleich . Sie steigt also exponentiell zur Anzahl der Kanten des vollstĂ€ndigen Graphen . Wenn die Knoten nicht nummeriert sind, isomorphe Graphen also nicht mitgezĂ€hlt werden, ist diese Anzahl etwa proportional zu , weil fĂŒr die meisten Isomorphieklassen alle Graphen, die sich durch Permutation der nummerierten Knoten ergeben, verschieden sind. Die folgende Tabelle zeigt die mit Hilfe eines Computers bestimmten Anzahlen fĂŒr :[6]
| Anzahl der einfachen ungerichteten Graphen | ||
|---|---|---|
| n | mit nummerierten Knoten | ohne nummerierte Knoten |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 8 | 4 |
| 4 | 64 | 11 |
| 5 | 1.024 | 34 |
| 6 | 32.768 | 156 |
| 7 | 2.097.152 | 1.044 |
| 8 | 268.435.456 | 12.346 |
Datenstrukturen
[Bearbeiten | Quelltext bearbeiten]| Ungerichteter Graph | Adjazenzmatrix |
|---|---|
FĂŒr die ReprĂ€sentation von Graphen im Computer gibt es im Wesentlichen zwei gebrĂ€uchliche Formen: die Adjazenzmatrix (auch Nachbarschaftsmatrix) und die Adjazenzliste (Nachbarschaftsliste). Die Bedeutung der beiden Darstellungen liegt darin, dass praktisch jede algorithmische Lösung graphentheoretischer Probleme auf wenigstens eine der beiden ReprĂ€sentationen zurĂŒckgreift. Eine weitere, aber seltener genutzte Möglichkeit zur Darstellung von Graphen im Computer ist die Inzidenzmatrix, die man auch als Knoten-Kanten-Matrix bezeichnet.
Inzidenzmatrizen sind zwar aufwĂ€ndiger zu implementieren und zu verwalten, bieten aber eine Reihe von Vorteilen gegenĂŒber Adjazenzmatrizen. Zum einen verbrauchen sie bei fester Anzahl von Kanten stets nur linear viel Speicherplatz bezĂŒglich der Anzahl der Knoten, was insbesondere bei dĂŒnnen Graphen (also Graphen mit wenig Kanten) von Vorteil ist, wĂ€hrend die Adjazenzmatrix quadratischen Platzbedarf bezĂŒglich der Anzahl Knoten besitzt (dafĂŒr aber kompakter bei dichten Graphen, also Graphen mit vielen Kanten ist). Zum anderen lassen sich viele graphentheoretische Probleme nur mit Adjazenzlisten in linearer Zeit lösen. In der Praxis verwendet man daher meist diese Form der ReprĂ€sentation.
Programmierung
[Bearbeiten | Quelltext bearbeiten]Das folgende Beispiel in der Programmiersprache C++ zeigt die Implementierung eines gerichteten Graphen mit Adjazenzlisten. Der gerichtete Graph wird als Klasse DirectedGraph deklariert. Bei der AusfĂŒhrung des Programms wird die Methode main verwendet.[7]
#include <iostream>
using namespace std;
// Deklariert den Datentyp fĂŒr die Knoten des Graphen
struct Node
{
int index;
string value;
Node* next;
};
// Deklariert den Datentyp fĂŒr die Kanten des Graphen
struct Edge
{
int startIndex;
int endIndex;
};
// Deklariert die Klasse fĂŒr den gerichteten Graphen
class DirectedGraph
{
public:
Node* nodes;
Node** headNodes;
// Diese Methode fĂŒgt einen neuen Knoten in die Adjazenzliste des Graphen ein und gibt ihn als RĂŒckgabewert zurĂŒck
Node* insertNewNode(int index, string value, Node* node)
{
Node* newNode = new Node; // Erzeugt einen neuen Knoten vom Typ Node
newNode->index = index; // Setzt den Index
newNode->value = value; // Setzt den Wert
newNode->next = node; // Setzt einen Zeiger auf den Nachfolger
return newNode;
}
// Konstruktor, der den gerichteten Graphen mit den gegebenen Knoten und Kanten erzeugt
DirectedGraph(Node mynodes[], Edge edges[], int numberOfEdges, int numberOfNodes)
{
nodes = mynodes; //speichert Knoten
headNodes = new Node*[numberOfNodes](); // Initialisiert ein Array von Zeigern fĂŒr die Nachbarknoten
for (int i = 0; i < numberOfEdges; i++) // for-Schleife, die alle Kanten des Graphen durchlÀuft
{
int startIndex = edges[i].startIndex; // Index des Startknotens der Kante
int endIndex = edges[i].endIndex; // Index des Endknotens der Kante
string value = nodes[endIndex].value; // Wert des Endknotens der Kante
Node* newNode = insertNewNode(endIndex, value, headNodes[startIndex]); // Aufruf der Methode insertNewNode, um einen neuen Knoten einzufĂŒgen
headNodes[startIndex] = newNode; // Setzt den Zeiger auf den neuen Knoten
}
}
};
// Gibt alle benachbarten Knoten von node auf der Konsole aus
void writeAdjacencyList(Node* node, Node* neighbor)
{
cout << "Knoten (" << node->index << ", " << node->value << "): ";
while (neighbor != nullptr)
{
cout << "(" << neighbor->index << ", " << neighbor->value << ") ";
neighbor = neighbor->next;
}
cout << endl;
}
// Hauptmethode, die das Programm ausfĂŒhrt
int main()
{
// Deklariert und initialisiert Arrays fĂŒr die Knoten und Kanten
Node nodes[] = { {0,"A"},{1,"B"},{2,"C"},{3,"D"},{4,"E"} };
Edge edges[] = { {0,1},{0,2},{1,4},{2,3},{3,1},{4,3} };
int numberOfNodes = sizeof(nodes) / sizeof(nodes[0]); // Ermittelt die Anzahl der Knoten
int numberOfEdges = sizeof(edges) / sizeof(edges[0]); // Ermittelt die Anzahl der Kanten
DirectedGraph directedGraph(nodes, edges, numberOfEdges, numberOfNodes); // Erzeugt den gerichteten Graphen mit den gegebenen Knoten und Kanten
for (int i = 0; i < numberOfNodes; i++) // for-Schleife, die alle Knoten des Graphen durchlÀuft
{
Node* headNode = directedGraph.headNodes[i];
writeAdjacencyList(&nodes[i], headNode); // Gibt die Adjazenzliste fĂŒr den Knoten node mit Nachbarn headNode aus
}
}
Siehe auch
[Bearbeiten | Quelltext bearbeiten]- Graphenspiele
- Kleine-Welt-PhÀnomen (Small-world-Netzwerk)
- Skalenfreies Netz
- Zufallsgraph
- Bandgraph
- Mengensystem
Literatur
[Bearbeiten | Quelltext bearbeiten]- Thomas H. Cormen, Charles Leiserson, Ronald L. Rivest, Clifford Stein: Algorithmen â Eine EinfĂŒhrung. 2. Auflage. Oldenbourg Wissenschaftsverlag, MĂŒnchen 2007, ISBN 978-3-486-58262-8, S. 531â533.
- Reinhard Diestel: Graphentheorie. 4. Auflage. Springer, Berlin u. a. 2010, ISBN 978-3-642-14911-5 (online: 4th Electronic Edition 2010, Free preview version â Erstausgabe: 1996).
- JĂŒrgen Ebert: Effiziente Graphenalgorithmen. In: Studien-Texte â Informatik. Akademische Verlags-Gesellschaft, Wiesbaden 1981, ISBN 3-400-00424-3 (Zugleich Habilitationsschrift an der UniversitĂ€t OsnabrĂŒck 1982).
- Dieter Jungnickel: Graphen, Netzwerke und Algorithmen. 3. vollstĂ€ndig ĂŒberarbeitete und erweiterte Auflage. BI-Wissenschafts-Verlag, Mannheim u. a. 1994, ISBN 3-411-14263-4 (Inhaltsverzeichnis [PDF; 1,2 MB]).
- Manfred Nitzsche: Graphen fĂŒr Einsteiger. Rund um das Haus vom Nikolaus. In: Studium. 3., ĂŒberarbeitete und erweiterte Auflage. Vieweg+Teubner, Wiesbaden 2009, ISBN 978-3-8348-0813-4.
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- â a b c d Reinhard Diestel: Graphentheorie. 4. Auflage. Springer, Berlin u. a. 2010, ISBN 978-3-642-14911-5, S. 1â34 (online: 4th elektronische Ausgabe 2010 â Erstausgabe: 1996).
- â Directed Graphs. In: Claude Sammut, Geoffrey I. Webb (Hrsg.): Encyclopedia of Machine Learning. Springer US, 2010, S. 279, doi:10.1007/978-0-387-30164-8_218.
- â bei gerichteten Graphen: in derselben Richtung
- â Stephen Wolfram: Finally We May Have a Path to the Fundamental Theory of Physics⊠and Itâs Beautiful abgerufen am 20. Januar 2024.
- â Brigitte Werners: Grundlagen des Operations Research. 3. Auflage. Springer, Berlin Heidelberg 2013, ISBN 978-3-642-40101-5, S. 175â209.
- â Folge A000088 in OEIS
- â Software Testing Help: Graph Implementation In C++ Using Adjacency List




