• Keine Ergebnisse gefunden

6. Einführung in Graphen

N/A
N/A
Protected

Academic year: 2021

Aktie "6. Einführung in Graphen"

Copied!
40
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

6. Einführung in Graphen

§ Anwendungen

§ Definitionen

§ Implementierung

- Adjazenzmatrix - Adjazenzliste - Kantenliste

- Implementierungshinweise für Java

(2)

Kommunikationsnetze (1)

Menge von Rechnern, die mit Leitungen verbunden sind.

Ringstruktur Busstruktur

Vollständig vernetzte Struktur Sternstruktur

Beispiele

Knoten (Rechner) Kante (Leitung)

(3)

Kommunikationsnetze (2)

Zuverlässigkeit von Kommunikationsnetzen

§ lässt sich bemessen durch:

§ Verbindungszusammenhang:

Minimale Anzahl von Verbindungen, bei deren Ausfall die Kommunikation zwischen irgendwelchen Knotenpaaren unterbrochen wird.

§ Knotenzusammenhang:

Minimale Anzahl von Knoten, bei deren Ausfall die Kommunikation zwischen irgendwelchen Knotenpaaren unterbrochen wird.

§ Algorithmus ® Flüsse in Netzwerken.

Routing-Problem

§ Bestimme von einem Rechnerknoten den günstigsten Weg zum Zielknoten.

Die Güte einer Verbindungskante ist dabei beispielsweise durch seine Paketkapazität definiert.

§ Algorithmus ® kürzeste Wege in Graphen

(4)

1

2 4

3

1

Routenplanung

Problemstellung

§ Finde in einem Straßennetz die kürzeste Verbindung (Länge bzw. Fahrtzeit) von einer Stadt A zu einer Stadt B.

§ Algorithmus ® kürzeste Wege in Graphen

3

8 7

4 5

1 2

0 6

1 4

1

1

8

6

2

7

(5)

Problemstellung

§ Zwischen n Orten soll ein Versorgungsnetz (Kommunikation, Strom, Wasser, etc.) aufgebaut werden, so dass je 2 Orte direkt oder indirekt miteinander verbunden sind.

Die Verbindungskosten zwischen 2 Orte seien bekannt.

§ Gesucht ist ein Versorgungsnetz mit den geringsten Kosten.

Netzplanung

§ Algorithmus ® minimal aufspannende Bäume

2

1

7

2 6 2

2 5

Orte mit Verbindungskosten

1

2

2

Günstigstes Versorgungsnetz

1 1

4 4

(6)

Zyklenfreiheit bei gerichteten Graphen (1)

§ Beispiel: Ausschnitt aus Vererbungsgraph für stream-Klassen in C++

§ Beispiel: include-Graph in C

ios

ostream istream

iostream

strstream fstream

mod.h

set.h

Dictionary.h

string.h

(7)

Zyklenfreiheit bei gerichteten Graphen (2)

§ Beispiel: Montageanleitung für Schrank

§ Algorithmus ® topologische Sortierung

Füße an Boden montieren

Linke Seitenwand

montieren Rechte Seitenwand

montieren

Decke montieren

Scharniere an Türen montieren

Linke Türe an linke Seitenwand

montieren Rechte Türe an rechte Seitenwand

montieren

(8)

§ Web-Seiten mit ihren Verweisen

Internet-Suchmaschinen (1)

§ Algorithmus für Besuch aller Knoten ® Tiefensuche A

B

C

D

§ Problemstellung: Indexierung

Besuche alle Internetseiten, extrahiere Schlüsselwörter und speichere diese in einen Index.

(9)

Internet-Suchmaschinen (2)

PageRank-Algorithmus von Page und Prin (s. [Turau])

1) Berechne für jede Internetseite w den PageRank r(w) nach folgender Formel:

Problemstellung: Relevanz von Internetseiten

§ Bei Eingabe eines Suchbegriffs durchsuchen die Suchmaschinen ihren Index.

Die gefundenen Internetseiten werden üblicherweise nach Relevanz sortiert ausgegeben.

§ Problem: Stelle die Relevanz von Internetseiten fest.

l(v) = Anzahl der

ausgehenden Links von v a Î [0,1] ist Dämpfungsfaktor

2) Wiederhole Schritt 1) solange, bis r(w) für alle Seiten hinreichend konvergiert.

v1

w vn

! " = 1 − & + & ∗ )

*+,-+ . /,- 0,12 345 6

!(8)

:(8)

(10)

Beispiel:

§ Für das Beispiel-Netz ergeben sich mit a = 0.5 folgende Gleichungen:

r(A) = 0.5 + 0.5*r(B) r(B) = 0.5 + 0.5*r(A)/2

r(C) = 0.5 + 0.5*(r(A)/2 + r(D)) r(D) = 0.5 + 0.5*r(C)

§ Beginnt man mit den Initialisierungswerten r(w) = 1 und wendet man die Gleichungen iterativ an,

ergeben sich bereits nach 4 Iterationen stabile Werte:

Internet-Suchmaschinen (3)

A

B

C

D

Iterationen r(A) r(B) r(C) r(D)

0 1 1 1 1

1 1 0.75 1.25 1

2 0.875 0.75 1.25 1.125

3 0.875 0.7188 1.2812 1.125

4 0.8594 0.7188 1.2812 1.1406

5 0.8594 0.7148 1.2852 1.1406

(11)

6. Einführung in Graphen

§ Anwendungen

§ Definitionen

§ Implementierung

- Adjazenzmatrix - Adjazenzliste - Kantenliste

- Implementierungshinweise für Java

(12)

Gerichteter Graph

§ Ein gerichteter Graph G = (V, E) besteht aus einer Menge V von Knoten (engl. vertices) und einer Menge E ⊆ V´V von Kanten (engl. edges).

§ Eine Kante ist ein geordnetes Paar von Knoten (v,w).

§ Die Kanten sind gerichtet: die Kante (v,w) geht von Knoten v nach Knoten w.

In den graphischen Darstellungen werden Pfeile verwendet.

§ Kanten der Form (v,v) heißen Schlingen.

§ Gerichtete Graphen werden auch Digraphen genannt.

V = { v1, v2, v3, v4, v5 }

E = { (v1,v2), (v2,v3), (v3,v1), (v3,v4), (v4,v2), (v5,v4) }

v1 v5 v4 v3

v2

Knoten

Kante

(13)

Ungerichteter Graph

V = { v1, v2, v3, v4, v5 }

E = { (v1,v2), (v1,v3), (v2,v3), (v2,v4), (v3,v4), (v5,v4) }

§ Bei einem ungerichteten Graphen G = (V, E) haben die Kanten keine Richtung.

§ Eine Kante ist gegeben durch ein ungeordnetes Paar von Knoten (v,w).

Es gilt (v,w) = (w,v).

§ Ein ungeordnetes Paar von Knoten (v,w) ist dasselbe wie die 2-elementige Menge von Knoten {v, w}. Es muss v ≠ w sein (keine Schlingen!).

§ Die Darstellung soll jedoch einfach bleiben. Daher werden wir sowohl für gerichtete als auch ungerichtete Kanten dieselbe Notation (v,w) verwenden.

v1 v5 v4 v3

v2

Knoten

Kante

(14)

Adjazenz

§ Bei einem ungerichteten Graphen ist die Adjazenzbeziehung immer symmetrisch.

Bei einem gerichteten Graphen ist die Adjazenzbeziehung im allg. unsymmetrisch.

§ Bei einer gerichteten Kante (v,w) wird w auch Nachfolger von v und v Vorgänger von w genannt.

§ Bei einer ungerichteten Kante (v,w) heißen v und w auch Nachbarn.

v

Der Knoten v hat 2 Vorgänger

und 3 Nachfolger (adjazente Knoten).

v

Der Knoten v hat 5 Nachbarn (adjazente Knoten)

§ Ein Knoten w ist adjazent zu (benachbart zu) einem Knoten v,

falls (v,w) eine Kante des (gerichteten bzw. ungerichteten) Graphen ist.

v w

v w

(15)

Grad

§ In einem ungerichteten Graphen ist der Grad eines Knoten die Anzahl seiner Nachbarn.

§ Bei einem gerichteten Graphen wird die Anzahl der Vorgänger Eingangsgrad und die Anzahl der Nachfolger Ausgangsgrad genannt.

v

Der Eingangsgrad von v ist 2 und der Ausgangsgrad 3.

v

Der Grad von v ist damit 5.

(16)

Weg

§ Ein Weg (engl. path) ist eine Folge von Knoten v1, v2, …, vn, wobei n ≥ 1 und (vi, vi+1) für 1 £ i < n Kanten im Graphen sind.

§ Die Länge des Weges v1, v2, …, vnist gleich der Anzahl der Kanten und damit n-1.

n darf 1 sein; dann hat der Weg die Länge 0.

§ Ein Weg heißt einfacher Weg, falls alle Knoten bis auf Anfangs- und Endknoten unterschiedlich sind.

v1 v5

v4 v3

v2

Ein einfacher Weg der Länge 3: v1, v2, v3, v4.

v1 v5 v4 v3

v2

Ein (nicht einfacher) Weg der Länge 5: v1, v2, v5, v4, v2, v3

(17)

Zyklus

§ Ein Weg v1, v2, …, vn in einem gerichteten Graph heisst Zyklus (cycle), falls Anfangsknoten v1 und Endknoten vn identisch sind

und n ≥ 2 ist (d.h. wenigstens eine Kante).

§ Ein Weg v1, v2, …, vn in einem ungerichteten Graph heisst Zyklus (cycle), falls Anfangsknoten v1 und Endknoten vn identisch sind,

n ≥ 4 ist (d.h. wenigstens drei Kanten) und alle Kanten unterschiedlich sind.

§ Zwei Zyklen sind gleich, falls sich ihre Wege (jeweils ohne Endknoten) durch eine zyklische Verschiebung unterscheiden.

§ Zyklenfreie Graphen werden auch azyklisch (acyclic graph) genannt.

v1 v5 v4 v3

v2

Ein nicht-einfacher Zyklus der Länge 6:

v1, v2, v3, v1, v5, v4, v1 v1 v5

v4 v3

v2

Ein einfacher Zyklus der Länge 3:

v1, v2, v3, v1

v1 v2

v3

Ein einfacher Zyklus (in einem gerichteten Graph)

der Länge 2:

v1, v2, v1

(18)

Teilgraph

§ Ein Graph G' = (V', E') ist ein Teilgraph von Graph G = (V, E), falls V' Í V und E' Í E

§ Enthält darüber hinaus G' alle Kanten aus E, die Knoten aus V' verbinden, dann heißt G' der durch V' induzierte Teilgraph von G, d.h.

E' = {(u,v) Î E / u,v Î V'}

v1 v2

v4 v5

v3

Graph G

v1 v2

v4 v3

Teilgraph von G

v1 v2

v4 v3

Der durch V' = {v1, v2, v3, v4} induzierte Teilgraph von G

(19)

Zusammenhang bei ungerichteten Graphen

§ Ein ungerichteter Graph heißt zusammenhängend (connected), falls es von jedem Knoten einen Weg zu jeden anderen Knoten gibt.

§ Eine Zusammenhangskomponente eines ungerichteten Graphen G ist ein maximal zusammenhängender Teilgraph.

v

Graph ist nicht zusammenhängend und besteht aus genau zwei

Zusammenhangskomponenten.

Graph ist zusammenhängend und besteht daher aus nur einer Zusammenhangskomponente

(20)

Starker und schwacher Zusammenhang bei gerichteten Graphen

§ Ein gerichteter Graph heißt stark zusammenhängend (strongly connected), falls es von jedem Knoten einen Weg zu jedem anderen Knoten gibt.

§ Wenn bei einem gerichteter Graph G der entsprechende ungerichtete Graph zusammenhängend ist, dann wird G auch schwach zusammenhängend

genannt. (weakly connected).

Gerichteter Graph, der schwach aber

nicht stark zusammenhängend ist. Gerichteter Graph, der stark

zusammenhängend ist.

(21)

Zusammenhangskomponenten bei gerichteten Graphen

§ Eine starke bzw. schwache Zusammenhangskomponente eines gerichteten Graphen G ist ein maximal stark bzw. schwach zusammenhängender

Teilgraph.

Gerichtete Graphen mit ihren

starken Zusammenhangskomponenten.

(22)

Wald und Baum

§ Ein ungerichteter und azyklischer Graph heißt auch Wald.

§ Ein zusammenhängender Wald heißt auch Baum.

Baum Wald

(23)

Wurzelbaum

§ Ein Wurzelbaum ist ein gerichteter, azyklischer Graph, bei dem genau ein Knoten – die sogenannte Wurzel – den Eingangsgrad 0 hat und alle

anderen Knoten den Eingangsgrad 1 haben.

§ Bei einer Kante (v,w) heisst v auch Elternknoten von w und w Kindknoten von v.

§ Knoten ohne Kinder heißen auch Blätter.

§ In der graphischen Darstellung zeigen die Kanten üblicherweise nach unten.

§ Die in Kapitel 1 eingeführten Suchbäume sind Wurzelbäume.

Wurzel v w

(24)

Gewichteter Graph

§ Ist jeder Kante (v,w) eine reelle Zahl c(v,w) als Kosten oder Gewicht zugeordnet, spricht man von einem gewichteten Graphen.

§ Sind darüber hinaus die Gewichte ³ 0, dann heißt der Graph auch Distanzgraph.

2

1

7

2 6 2

2 5 1

4

(25)

6. Einführung in Graphen

§ Anwendungen

§ Definitionen

§ Implementierung

- Adjazenzmatrix - Adjazenzliste - Kantenliste

- Implementierungshinweise für Java

(26)

Adjazenzmatrix für ungewichtete Graphen

A[i][j] = 1, falls es eine Kante von vi und nach vj gibt 0 sonst

v0

v1 v2

v3 v4

0 1 0 0 1

1 0 1 0 1

0 1 0 1 1

0 0 1 0 1

1 1 1 1 0 [0] [1] [2] [3] [4]

[0]

[1]

[2]

[3]

[4]

Beachte: Die Adjazenzmatrizen sind bei einem ungerichteten Graphen symmetrisch und bei einem gerichteten Graphen im allgemeinen unsymmetrisch.

v0

v1 v2

v3 v4

0 1 0 0 0

0 0 1 0 1

0 0 0 1 1

0 0 0 0 0

1 0 0 1 0 [0] [1] [2] [3] [4]

[0]

[1]

[2]

[3]

[4]

(27)

Adjazenzmatrix für gewichtete Graphen

A[i][j] = c(v,w), falls es eine Kante von Knoten v nach w gibt

¥ sonst

v0

v1 v2

v3 v4

¥ 2 ¥ ¥ 4 2 ¥ 7 ¥ 1

¥ 7 ¥ 3 6

¥ ¥ 3 ¥ -3 4 1 6 -3 ¥ [0] [1] [2] [3] [4]

[0]

[1]

[2]

[3]

[4]

Beachte: Die Adjazenzmatrizen sind bei einem ungerichteten Graphen symmetrisch und bei einem gerichteten Graphen im allgemeinen unsymmetrisch.

v0

v1 v2

v3 v4

¥ 2 ¥ ¥ ¥

¥ ¥ 7 ¥ 1

¥ ¥ ¥ 3 6

¥ ¥ ¥ ¥ ¥ 4 ¥ ¥ -3 ¥ [0] [1] [2] [3] [4]

[0]

[1]

[2]

[3]

[4]

2

4

7

6 3

-3 1

2

4

7

6 3

-3 1

(28)

Adjazenzliste bei ungerichteten Graphen

§ Speichere für jeden Knoten eine linear verkettete Liste mit allen Nachbarknoten (Adjazenzliste).

§ Kanten werden bei beiden Endknoten eingetragen.

v0

v1 v2

v3 v4

[0]

[1]

[2]

[3]

[4]

1 4

0 2

1 3 4

2

0 1 2

4

§ Bei einem gewichteten Graphen wird noch zusätzlich das Kantengewicht eingetragen.

§ Um die Dynamisierbarkeit der Datenstruktur zu verbessern, kann statt eines Feldes auch eine dynamische Datenstruktur wie ein binärer Suchbaum

verwendet werden.

(29)

Adjazenzliste bei gerichteten Graphen

§ Bei einem gerichteten Graphen werden zwei getrennte Listen verwaltet:

eine Vorgänger-Liste und eine Nachfolger-Liste.

v0 v1

v3 v2

[0]

[1]

[2]

[3]

1

1 3

[0]

[1]

[2]

[3] 2

0 2

Nachfolger-Liste

Vorgänger-Liste

(30)

Kantenliste

§ Speichere die Menge aller Kanten in einer sortierten Suchstruktur (sortiertes Feld oder Suchbaum).

§ Aus einer linearen Ordnung für Knoten ergibt sich eine lineare Ordnung für Kanten:

(v, v') £ (w, w') falls v < w oder v = w und v' £ w'

§ Beispiel: sortiertes Kanten-Feld

v0

v1 v2

v3 v4

0 0 1 1 1 2 2 2 3 4 4 4

1 4 0 2 4 1 3 4 2 0 1 2

[0] [1] [2] … [11]

i j

Alle Nachbarknoten zu v2 sind effizient auffindbar.

§ Bei einem ungerichten Graphen wird für eine Kante von v nach w sowohl (v,w) als auch (w,v) gespeichert.

§ Bei einem gerichteten Graphen wird die Kantenliste in Vorgänger- und Nachfolger-Liste aufgeteilt.

(31)

Dünn- und dichtbesetzte Graphen

§ Falls |E| = O(|V|) (dünnbesetzter Graph; sparse graph), dann ist die Speicherung als Adjazenzliste oder Kantenliste Speicherplatz sparender und effizienter in der Laufzeit.

§ Falls |E| = O(|V|2) (dichtbesetzter Graph; dense graph), dann ist die Speicherung als Adjazenzmatrix Speicherplatz sparender und effizienter in der Laufzeit.

§ Vollständiger Graph (alle Knotenpaare sind durch eine Kante verbunden) ist dichtbesetzt.

§ Es gilt: |E| = |V|*(|V|-1)/2 = O(|V|2) .

§ Manhattan-Graph (Graph für Mahattan mit Kreuzungen als Knoten und

Strassen als Kanten) ist dünnbesetzt.

§ Es gilt: |E| ≈ 2*|V| = O(|V|) .

(32)

6. Einführung in Graphen

§ Anwendungen

§ Definitionen

§ Implementierung

- Adjazenzmatrix - Adjazenzliste - Kantenliste

- Implementierungshinweise für Java

(33)

Adjazenzmatriz als zweidimensionales Feld

§ Knoten sind durchnummeriert: 0, 1, 2, ..., n-1

§ Nehme Knotennummer als Index eines zweidimensionalen Felds

§ Beispiel: ungerichteter und gewichteter Graph

int n = 10; // Anzahl der Knoten

double [ ][ ] adjcencyMatrix = new double[n][n];

adjcencyMatrix[1][2] = 3.5; // Kante von 1 nach 2 mit Gewicht 3.5 eintragen adjcencyMatrix[2][1] = 3.5; // Kante von 2 nach 1 mit Gewicht 3.5 eintragen

§ Bei ungewichteten Graphen sind Gewichte 0 oder 1.

§ Bei gerichteten Graphen ist Matrix i.a. nicht symmetrisch.

(34)

Feld oder Listen von Adjazenzlisten

§ Knoten sind durchnummeriert: 0, 1, 2, ..., n-1.

§ Beispiel: ungerichteter Graph:

int n = 10; // Anzahl der Knoten

List<List<Integer>> adjacencyList = newArrayList<>(n);

for (int i = 0; i < n; i++)

adjacencyList.add( new LinkedList<>() );

adjacencyList.get(1).add(2); // Kante von 1 nach 2 eintragen adjacencyList.get(2).add(1); // Kante von 2 nach 1 eintragen

adjacencyList[0]

[1]

[2]

...

[8]

[9]

2 1

§ Gewichte können bei den Knoten abgespeichert werden.

§ Bei gerichteten Graphen werden Nachfolger und Vorgänger in separate Listen gehalten.

§ Statt die adjazenten Knoten in Listen zu speichern,

ließen sich sich auch Sets (bei ungewichteten Graphen)

oder Maps (bei gewichteten Graphen) einsetzen.

(35)

Interne Nummerierung für Graph-Knoten

Stuttgart

Ulm München

90 km

150km

§ In der Praxis kommt es häufig vor, dass die Graph-Knoten nicht von 0 bis n-1 nummeriert sind, sondern beispielsweise als Strings gegeben sind.

§ Die Schlüssel können dann mit Hilfe einer Map (TreeMap oder HashMap) in eine interne Nummerierung von 0 bis n-1 umgerechnet werden:

- Stuttgart à 0 - Ulm à 1

- München à 2

§ Die inverse Umrechnung von interner Nummerierung in den Schlüssel lässt sich mit einem einfachen Feld realisieren:

- Stuttgart ß 0 - Ulm ß 1

- München ß 2

§ Mittels der internen Nummerierung lässt sich dann eines der indizierten Zugriffsverfahren von der vorhergehenden Seite verwenden.

(36)

Graph als Map

§ Eine Map ordnet jedem Knoten eine Adjazenzliste zu.

§ Bei gewichteten Graphen sind die Adjazenzlisten ebenfalls Maps und ordnen jedem adjazenten Knoten ein Gewicht zu.

§ Bei ungewichteten Graphen können dagegen einfachheitshalber Sets verwendet werden.

§ Knotentyp V ist generisch und kann z.B. Integer oder String sein..

§ Maps können entweder HashMaps oder TreeMaps sein (siehe Beispiel nächste Seite).

Map< V, Map<V, Double> > gewichteterGraph = ...

Map< V, Set<V> > ungewichteterGraph = ...

Adjazente Knoten

(37)

Beispiel: ungerichteter und gewichteter Graph als TreeMap

intn = 7; // Anzahl Knoten

Map<Integer, Map<Integer, Double>> g = new TreeMap<>(); // ungerichteter und gewichteter Graph for (inti = 0; i < n; i++)

g.put(i, new TreeMap<>());

g.get(4).put(3, 1.2); // Kante von 4 nach 3 mit Gewicht 1.2 eintragen g.get(3).put(4, 1.2);

g.get(4).put(6, 2.5); // Kante von 4 nach 6 mit Gewicht 2.5 eintragen g.get(6).put(4, 2.5);

g.get(4).put(2, 0.5); // Kante von 4 nach 2 mit Gewicht 0.5 eintragen g.get(2).put(4, 0.5);

3

5 6

1

§ Graph als TreeMap

§ Mit Knoten als Schlüssel und Adjazenzlisten als Nutzdaten

§ Die Adjazenzlisten sind ebenfalls TreeMaps.

4 3 1.2

6 2.5

2 0.5

2

4 1.2

4 2.5

4 0.5

(38)

Darstellung der Algorithmen in Pseudo-Code (1)

§ Um einfach und von der konkreten Datenstruktur für Graphen unabhängig zu bleiben, wird bei der Formulierung der Algorithmen folgender Pseudo- Code benutzt:

§ Ungerichtete und gerichtete Graphen:

for ( jeden Nachbarn w von v ) {

}

§ Ungerichtete Graphen:

for ( jede Kante (v,w) ) {

}

for ( jeden Knoten v ) {

}

for ( jeden Nachfolger w von v ) {

}

§ Gerichtete Graphen:

for ( jeden Vorgänger w von v ) {

}

for ( jeden adjazenten Knoten w von v) {

}

(39)

Darstellung der Algorithmen in Pseudo-Code (2)

§ Die hier in Pseudo-Code dargestellten Schleifen lassen sich in Java mit den besprochenen Datenstrukturen (Adjazenzmatrix, Adjazenzliste und Kantenliste) einfach realisieren.

Pseudo-Code: Java:

for ( jeden Knoten v ) {

}

for ( jeden Nachfolger w von v ) {

}

// Map-basierte Adjazenzliste für ungewichteten Graphen:

Map<Vertex, Set<Vertex>> adjacencyList = newTreeMap<>();

for(Vertex v : adjacencyList.keySet() ) { ...

}

// adjacencyList wie oben definiert for(Vertex w : adjacencyList.get(v) ) { } ...

(40)

§ Bei der Formulierung der Algorithmen sollen auch die Datenstrukturen möglichst einfach gehalten werden.

§ Oft muss für jeden Knoten eine Information gespeichert werden.

§ Im Pseudo-Code werden einfachheitshalber Felder mit Knoten als Indizierung gewählt.

§ Sind die Knoten durchnummeriert, dann kann der Pseudo-Code direkt in Java

übernommen werden. Bei einem beliebigen Knotentyp kann eine Map gewählt werden.

int[ ] inDegree;

...

for ( jeden Knoten v ) {

inDegree[v] = Anzahl der Vorgänger;

if (inDegree[v] == 0) ...

}

for ( jeden Nachfolger w von v ) { if (--inDegree[w] == 0)

...

}

Pseudo-Code:

Darstellung der Algorithmen in Pseudo-Code (3)

Map<Vertex, Integer> inDegree = new ...;

...

for ( jeden Knoten v ) {

inDegree.put(v, Anzahl der Vorgänger);

if (inDegree.get(v) == 0) ...

}

for ( jeden Nachfolger w von v ) {

inDegree.put(w, inDegree.get(w)-1);

if (inDegree.get(w) == 0) ...

Java:

Referenzen

ÄHNLICHE DOKUMENTE

Ein gerichteter Graph besteht aus sogenannten Knoten und Kanten, Die Knoten werden üblicherweise zeichnerisch durch Punkte und die Kanten durch Pfeile dargestellt, die von einem

Sie m¨ ussen diese dabei nicht vollst¨ andig definieren, sondern es gen¨ ugt, die Idee

Sie m¨ ussen diese dabei nicht vollst¨ andig definieren, sondern es gen¨ ugt, die Idee anzugeben.. Zeigen Sie die Aussage auf

• Entscheiden, ob ein gerichteter Graph stark zusammenhängend ist, ob also jeder Knoten von jedem Knoten erreichbar ist.. Immerman

b) Es gibt eine erkennbare Sprache, f¨ur die es keinen ¨aquivalenten NEA mit genau einem Endzustand gibt. Wenden Sie auf folgenden NEA die Potenzmengenkonstruktion an und berechnen

Ein Knoten eines Graphen heißt verbindbar mit einem Knoten , wenn es einen Weg im Graphen gibt, der als Endknoten hat.. Ein Graph ist zusammenhängend, wenn je zwei

3 Balancing the Supply/Demand Only In this section, we study the single objective problem of finding a partition of the graph into connected subgraphs that balances (approximately)

  Felder mit einem Namen zzz, die den Access-Type exposedField haben, haben implizit den Namen zzz_changed, wenn sie als Ausgabe-Feld verwendet werden, und den Namen set_zzz,