Modul Effiziente Graphenalgorithmen Bachelor Informatik 2

Werbung
Modul Effiziente Graphenalgorithmen
Bachelor Informatik 2. Semester
Inhaltsverzeichnis
1 Modulbeschreibung
2
2 Bestimmung aller Knotengrade
4
3 Bäume
5
4 Topologisches Sortieren
6
5 Breitensuche (Breadth-First Search) für ungerichtete Graphen
8
6 Tiefensuche (Depth-First Search)
10
6.1
Tiefensuche auf gerichteten Graphen . . . . . . . . . . . . . . . . . . .
10
6.2
BFS zur Bestimmung der stark zusammenhängenden Komponenten eines gerichteten Graphen . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Tiefensuche auf ungerichteten Graphen . . . . . . . . . . . . . . . . . .
15
6.3
7 Minimalgerüste und Greedy-Algorithmus
17
7.1
Algorithmen zur Bestimmung von Minimalgerüsten . . . . . . . . . . .
17
7.2
Der Greedy-Algorithmus und Matroide . . . . . . . . . . . . . . . . . .
20
7.3
Das Steinerbaumproblem und andere Varianten des
Minimalgerüstproblems . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
8 Maximalfluß
25
8.1
Flüsse und Schnitte . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
8.2
Der Algorithmus von Ford/Fulkerson . . . . . . . . . . . . . . . . . . .
28
8.3
Der Algorithmus von Dinitz . . . . . . . . . . . . . . . . . . . . . . . .
31
9 Unabhängige Knoten- und Kantenmengen
9.1
9.2
Die Probleme Vertex Cover, Maximum Independent Set und Maximum
Clique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
36
Maximum Matching: Paarungen und ihre Bestimmung in paaren Graphen 39
1
9.3
Knotenfärbungen von Graphen . . . . . . . . . . . . . . . . . . . . . .
41
9.4
Chordale Graphen, Intervallgraphen und perfekte Graphen . . . . . . .
42
9.4.1
Chordale Graphen . . . . . . . . . . . . . . . . . . . . . . . . .
42
9.4.2
Intervallgraphen . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
Stable Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
9.5
10 Eulerkreise
50
2
1
Modulbeschreibung
“Das Modul führt in die Grundlagen effizienter Graphenalgorithmen für Informatiker
ein, behandelt grundlegende Probleme und Methoden wie vollständiges Durchsuchen
von Graphen, minimum spanning trees, Maximalfluß in Netzwerken, das Matchingproblem, Färbungsprobleme sowie Baumstrukturen in Graphen und Dekomposition sowie
Weitebegriffe. Außerdem werden einige spezielle Graphenklassen behandelt wie z.B.
chordale Graphen, Intervallgraphen, perfekte Graphen sowie planare Graphen.”
Im SS 2010 behandelte Inhalte:
1. Graphen und ihre Darstellung
2. Gerichtete azyklische Graphen - Charakterisierung und Erkennung
3. Breitensuche (BFS) auf ungerichteten Graphen
4. Tiefensuche (DFS) auf gerichteten Graphen; stark zusammenhängende Komponenten;
5. Algorithmus von Kosaraju-Sharir; Anwendung 2SAT
6. DFS auf ungerichteten Graphen
7. Minimalgerüste (minimum spanning tree)
8. Die Algorithmen von Jarnik-Prim-Dijkstra und von Kruskal
9. Der greedy-Algorithmus; Matroide; Optimalität des greedy-Algorithmus
10. Maximalfluß in Netzwerken und Anwendungen
11. Der Algorithmus von Ford-Fulkerson
12. Der Algorithmus von Dinitz
13. Das maximum matching Problem in bipartiten Graphen
14. Knoten- und Kantenfärbungen in Graphen mit Anwendungsbeispielen
15. Chordale Graphen und Intervallgraphen; perfekte Graphen
16. Das Problem Stable Matching
Das hier verfügbare Skript ist kein Ersatz für ein Lehrbuch und auch kein Ersatz für
eine Mitschrift der Vorlesungen. Es soll lediglich helfen, Algorithmen, Definitionen und
Zusammenhänge in Form von Theoremen und Lemmata korrekt und sauber darzustellen, so daß der Hörer/die Hörerin entlastet ist vom mühseligen Mitschreiben von
langen und komplizierten Texten wie z.B. Algorithmen.
3
Literatur:
Es gibt eine Fülle von Lehrbuchliteratur zum Thema Graphenalgorithmen. Viele
Bücher zum Thema Algorithmen widmen diesem Thema ein oder mehrere Kapitel
wie z.B. das untengenannte Buch von Kleinberg und Tardos sowie das von Ottman
und Widmayer. Andere befassen sich ausschließlich mit dem Thema Graphen und Algorithmen. Hier ist eine Auswahl:
• A. Brandstädt, Graphen und Algorithmen, Teubner, 1994
• J. Kleinberg, E. Tardos, Algorithm Design, Addison-Wesley, Pearson, 2005
• M.C. Golumbic, Algorithmic Graph Theory and Perfect Graphs, Academic Press
1980, Annals of Discrete Mathematics, 57, 2004
• T. Ottmann, P. Widmayer, Algorithmen und Datenstrukturen, Spektrum, 2002
• S. Even, Graph algorithms, Computer Science Press, Potomac, Maryland, 1979
4
2
Bestimmung aller Knotengrade
a) in ungerichteten Graphen:
Algorithmus 2.1
Eingabe: Schlichter ungerichteter Graph G = (V, E) in Adjazenzlistendarstellung.
Ausgabe: Array [deg(v)]v∈V der Knotengrade.
(1)
(2)
(3)
for all v ∈ V do deg(v) := 0;
for all v ∈ V do
for all w ∈ L(v) do deg(v) := deg(v) + 1;
b) in gerichteten Graphen:
Algorithmus 2.2
Eingabe: Gerichteter Graph G = (V, E) in Adjazenzlistendarstellung
Ausgabe: Arrays [indeg(v)]v∈V der Ingrade sowie [outdeg(v)]v∈V der Ausgrade.
(1)
(2)
(3)
(4)
(5)
for all v ∈ V do begin indeg(v) := 0; outdeg(v) := 0 end;
for all v ∈ V do
for all w ∈ L(v) do
begin
outdeg(v) := outdeg(v) + 1;
indeg(w) := indeg(w) + 1
end
5
3
Bäume
Satz 3.1 Es sei G = (V, E) ein endlicher ungerichteter Graph mit |V | = n ≥ 1. Die
folgenden Eigenschaften sind äquivalent:
(1) G ist Baum.
(2) G ist maximal kreisfrei, d.h. G ist kreisfrei, und beim Hinzufügen einer neuen
Kante entsteht ein Kreis.
(3) Zwischen je zwei Knoten a, b ∈ V gibt es genau einen einfachen Weg.
(4) G ist minimal zusammenhängend, d.h. G ist zusammenhängend und nach Wegnahme einer Kante ist G nicht mehr zusammenhängend.
(5) G ist kreisfrei und |E| = n − 1.
(6) G ist zusammenhängend und |E| = n − 1.
Algorithmus 3.1
Eingabe: Ein Graph G = (V, E), beschrieben durch seine Adjazenzlisten.
Frage:
Ist G ein Baum?
(1) Teste, ob G zusammenhängend ist und |E| = |V | − 1 gilt.
(2) Wenn ja, ist G Baum, sonst nicht.
Definition 3.1 Es sei G = (VG , EG ) endlicher ungerichteter zusammenhängender
Graph. Ein Baum T = (VT , ET ) heißt Gerüst (spanning tree) von G, falls VT = VG
gilt. Ist G nicht zusammenhängend, so heißt F spanning forest von G, falls die Zusammenhangskomponenten von F Gerüste der Zusammenhangskomponenten von G sind.
Durchsuchen von Binärbäumen und Angabe einer Knotenreihenfolge:
(1) preorder(Bε ) = ∅ – die leere Folge von Knoten.
(2) preorder((x, B1, B2 )) = (x, preorder(B1), preorder(B2))
Analog definiert man inorder und postorder mit demselben Induktionsanfang sowie den
Bedingungen
(2′ ) inorder(B) = (inorder(B1 ), x, inorder(B2 )) bzw.
(2′′ ) postorder(B) = (postorder(B1 ), postorder(B2), x) für B = (x, B1 , B2 )
6
4
Topologisches Sortieren
Definition 4.1 Es sei G = (V, E) ein endlicher gerichteter Graph mit V
{v1 , . . . , vn }.
=
(1) G heißt gerichteter azyklischer Graph (directed acyclic graph, dag), falls G keine
gerichteten Kreise enthält.
(2) Eine Reihenfolge σ = (v1 , . . . , vn ) aller Knoten aus V heißt topologische Ordnung
von G, falls gilt: In der Reihenfolge σ zeigen alle Kanten von links nach rechts.
Das heißt:
für alle Kanten (vj , vk ) ∈ E gilt j < k, d.h. vj ist links von vk in σ.
Lemma 4.1 Jeder dag enthält einen Knoten v mit indeg(v) = 0.
Prinzip eines Algorithmus zur Erkennung von dags:
Gegeben: Gerichteter Graph G = (V, E).
Frage: Ist G dag? Wenn ja, gib eine topologische Ordnung σ von G an.
Prinzip: Am Anfang ist die Knotenreihenfolge σ leer. Bestimme so lange einen Knoten
v mit indegree 0, füge v an σ an und verringere den indegree aller Knoten w mit (v, w) ∈
E um 1 (dabei können neue Knoten mit indegree 0 entstehen, die der Algorithmus sich
merkt), bis entweder alle Knoten aus V in σ aufgenommen sind oder sich herausstellt,
daß dies nicht geht - im zweiten Fall ist G kein dag.
7
Formale Beschreibung:
Algorithmus 4.1
Eingabe: Ein gerichteter Graph G = (V, E), beschrieben durch seine Adjazenzlisten.
Ausgabe: Eine topologische Ordnung σ von G oder die Antwort
“G ist kein dag”.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
Berechne mit Algorithmus 2.2 die Ingrade indeg(v) aller Knoten v ∈ V .
Q := ∅ {Q ist eine Warteschlange}; σ:=leere Folge;
for all v ∈ V do
if indeg(v) = 0 then Q := add(Q, v);
while Q 6= ∅ do
begin
u := f irst(Q); σ := (σ, u);
Q := remove(Q, u);
for all (u, w) ∈ E do
begin
indeg(w) := indeg(w) − 1;
if indeg(w) = 0 then Q := add(Q, w)
end;
end;
if σ enthält nicht alle Knoten aus V then G ist kein dag
else σ ist topologische Ordnung von G.
Satz 4.1 Der Algorithmus 4.1 ist korrekt und in Linearzeit ausführbar.
Wie bestimmt man einen gerichteten Kreis, falls G kein dag ist?
Ein Erkennungsalgorithmus heißt zertifizierender Algorithmus (certifying algorithm),
falls sowohl bei der Ja- als auch bei der Nein-Antwort des Algorithmus ein (leicht
zu zertifizierender) Beleg mitgeliefert wird - im Beispiel der Erkennung von dags ist
dies für die Ja-Antwort eine topologische Ordnung des Eingabegraphen G, und für die
Nein-Antwort ist ein gerichteter Kreis in G ein guter Beleg.
8
5
Breitensuche (Breadth-First Search) für ungerichtete Graphen
Breitensuche (Breadth-First Search, BFS) ist ein Algorithmus, der alle Knoten eines
ungerichteten Graphen G = (V, E), dargestellt durch seine Adjazenzlisten, über Kanten
aus E durchläuft und die Durchlaufreihenfolge angibt. Es sei [b(v)]v∈V ein array, der
mit b(v) = ∞ für alle v ∈ V initialisiert wird und der am Ende die BFS-Nummern der
Knoten in der Reihenfolge ihres Erreichens (und ihrer Aufnahme in die Warteschlange)
enthalten soll.
Prinzip:
Für jede Zusammenhangskomponente Z des Graphen wähle einen Startknoten, von
dem aus alle übrigen Knoten von Z über Kanten von G erreicht werden. Die Reihenfolge
richtet sich nach der Aufnahme in eine Warteschlange.
Formale Beschreibung:
Algorithmus 5.1 BFS
Eingabe:
Ein ungerichteter Graph G = (V, E), gegeben durch seine Adjazenzlisten, sowie
ein array [b(v)]v∈V .
Ausgabe: Eine Menge B von gerichteten Kanten mit der Eigenschaft, daß
der B zugrundeliegende ungerichtete Graph für jede Zusammenhangs–
komponente von G ein Gerüst liefert, sowie eine Numerierung [b(v)]v∈V ,
die die Reihenfolge beim Einfügen in die Warteschlange Q angibt.
(1) B := ∅; i := 0; Q := ∅;
(2) for all v ∈ V do b(v) := ∞;
(3) while (Q = ∅ und es existiert ein v ∈ V mit b(v) = ∞) do
begin
(4)
Q := add(Q, v); i := i + 1; b(v) := i;
(5)
while Q 6= ∅ do
begin
(6)
v := f irst(Q);
(7)
Q := remove(Q, v);
(8)
for all w ∈ N(v) mit b(w) = ∞ do
begin
(9)
Q := add(Q, w); i := i + 1; b(w) := i;
(10)
B := B ∪ {(v, w)};
end
end
end
Satz 5.1 Der Algorithmus 5.1 ist korrekt und in Linearzeit ausführbar.
9
Anwendungsbeispiele:
1. Bestimmung der Zusammenhangskomponenten eines ungerichteten Graphen
bzw. Test auf Zusammenhang
2. Erkennung bipartiter Graphen
3. Kürzeste Wege und Distanzen vom Startknoten zu allen übrigen Knoten
4. Auffinden von Kreisen
10
6
Tiefensuche (Depth-First Search)
6.1
Tiefensuche auf gerichteten Graphen
[A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, AddisonWesley 1982, S. 215-226]
Prozedur 6.1 df s(v)
(1)
(2)
(3)
mark(v):=visited;
for each vertex w on L(v) do
if mark(w):=unvisited then dfs(w)
Algorithmus 6.1 DF S(G)
Eingabe:
Ein gerichteter Graph G = (V, E) mit Knotenmenge {1, 2, . . . , n},
der durch seine Adjazenzlisten [L(v)]v∈V sowie einen array
mark(v) ∈ {visited, unvisited} beschrieben ist.
(1) for v := 1 to n do
(2)
mark(v):=unvisited;
(3) for v := 1 to n do
(4)
if mark(v):=unvisited then dfs(v)
Anders als bei BFS sind bei DFS zwei verschiedene Numerierungen sinnvoll:
1. entsprechend dem Beginn der jeweiligen Prozedur dfs(v);
2. entsprechend der Beendigung der jeweiligen Prozedur dfs(v);
Variante mit Angabe eines spanning forest:
Prozedur 6.2 df stree(v)
(1)
(2)
(3)
(4)
(5)
mark(v):=visited;
for each vertex w on L(v) do
if mark(w):=unvisited then
begin
ET := ET ∪ {(v, w)};
dfstree(w)
end
11
Algorithmus 6.2 DF S − F orest(G)
Eingabe:
Ein gerichteter Graph G = (V, E) mit Knotenmenge {1, 2, . . . , n},
der durch seine Adjazenzlisten [L(v)]v∈V sowie einen array
mark(v) ∈ {visited, unvisited} beschrieben ist.
(0) ET := ∅;
(1) for v := 1 to n do
(2)
mark (v):=unvisited;
(3) for v := 1 to n do
(4)
if mark(v):=unvisited then dfstree(v)
Eigenschaft 6.1 Es sei G = (V, E) gerichteter Graph.
(1) Wenn df s(y) von df s(x) aus aufgerufen wird, so existiert ein gerichteter Weg
x → . . . → y von x nach y.
(2) Wenn df s(x) die zuletzt beendete dfs-Prozedur aller Knoten aus V bei DFS auf
G ist und es existiert ein gerichteter Weg y → . . . → x in G von y nach x, so
existiert auch ein gerichteter Weg x → . . . → y in G von x nach y in G, da in
diesem Fall df s(y) von df s(x) aus aufgerufen wird: [x . . . [y . . .]y . . .]x .
Ein gerichteter Graph G = (V, E) heißt stark zusammenhängend (strongly connected),
falls für je zwei Knoten x, y ∈ V ein gerichteter Weg von x nach y sowie ein gerichteter
Weg von y nach x existiert.
Die stark zusammenhängenden Komponenten eines gerichteten Graphen G sind die
größten stark zusammenhängenden Teilgraphen von G.
Eigenschaft 6.2 Es sei G = (V, E) gerichteter Graph und x ∼ y die folgende binäre
Relation auf V : x ∼ y, falls x = y oder x und y liegen in einem gemeinsamen gerichteten Kreis.
(1) Die Relation x ∼ y ist Äquivalenzrelation auf V .
(2) Faktorisiert man G nach ∼, d.h. die Äquivalenzklassen von ∼ werden die Knoten
eines Graphen G∗ = (V ∗ , E ∗ ), und (x∗ , y ∗) ∈ E ∗ , falls eine Kante (x′ , y ′) ∈ E
existiert mit x′ ∈ x∗ und y ′ ∈ y ∗, so ist G∗ ein dag.
Eigenschaft 6.3 Es sei G = (V, E) gerichteter Graph und T1 , . . . , Tk die (in dieser zeitlichen Reihenfolge) durch Ausführung von DFS-Forest(G) auf G konstruierten
Bäume. Dann verlaufen Kanten zwischen diesen Bäumen nur von rechts nach links,
d.h. der entsprechende Graph ist ein dag.
12
Algorithmus 6.3 (Kosaraju, Sharir) (Stark
von G)
zusammenhängende Komponenten
Ein gerichteter Graph G = (V, E) mit Knotenmenge {1, 2, . . . , n},
der durch seine Adjazenzlisten [L(v)]v∈V beschrieben ist.
Ausgabe: Die stark zusammenhängenden Komponenten von G als die Bäume des
in Schritt (3) konstruierten spanning forest.
Eingabe:
(1) Führe DF S(G) aus und numeriere die Knoten in der Reihenfolge der Beendigung
ihrer Prozedur df s(v), d.h., derjenige Knoten, dessen dfs-Prozedur zuletzt endet,
erhält die Nummer n = |V |.
(2) Konstruiere den Graphen Grev , der aus G durch Umkehrung der Kantenrichtung
entsteht.
(3) Führe DF S − F orest(Grev ) aus, wobei mit dem Knoten höchster Nummer begonnen wird. Wenn nicht alle Knoten erreicht werden, starte jeweils neu mit dem
noch nicht erreichten Knoten mit höchster Nummer.
(4) Ausgabe: Jede Zusammenhangskomponente im DFS spanning forest F von Grev
entspricht genau einer stark zusammenhängenden Komponente von G.
Satz 6.1 Der Algorithmus 6.3 ist korrekt und in Linearzeit ausführbar.
Beweis. Wir zeigen durch Induktion über die Zahl der stark zusammenhängenden
Komponenten, daß der Punkt (4) im obigen Algorithmus 6.3 korrekt ist. Es sei xmax
derjenige Knoten, dessen dfs-Prozedur zuletzt endet.
1. Zunächst betrachten wir die durch Anwendung von DF S − F orest(Grev ) konstruierten Bäume T1 , . . . , Tk . Wegen Eigenschaft 6.3 verlaufen alle Kanten zwischen diesen
Bäumen von rechts nach links. Daher ist jede stark zusammenhängende Komponente
von Grev (und damit auch von G) ganz in einem dieser Bäume enthalten.
2. Nun zeigen wir: T1 ist genau die stark zusammenhängende Komponente, die den
Knoten xmax enthält. Es seien v und w in demselben, durch DF S − F orest(Grev )
konstruierten, Baum T1 mit Wurzel xmax enthalten. Wir können annehmen, daß v und
w von xmax verschieden sind. Weil v im Baum T1 Nachfolger der Wurzel xmax ist, gibt
es einen gerichteten Weg xmax → . . . → v in Grev , d.h. es gibt einen gerichteten Weg
v → . . . → xmax in G. Wegen Eigenschaft 6.1 (2) gibt es dann auch einen gerichteten
Weg xmax → . . . → v in G, und damit liegen v und xmax in einem gerichteten Kreis.
Analog zeigt man, daß w und xmax in einem gerichteten Kreis liegen, und damit liegen
v und w in derselben starken Zusammenhangskomponente von G. Ist k = 1, so ist
damit die Korrektheit des Algorithmus bewiesen. Im Falle k > 1 erfolgt Induktion
über die Zahl der stark zusammenhängenden Komponenten, die korrekt ist, da die
DFS-Reihenfolge auf dem durch T2 , . . . , Tk beschriebenen Teilgraphen dieselbe ist wie
beim Weglassen von T1 und Ausführung auf dem kleineren Graphen.
q.e.d.
13
Anwendung: Ein Linearzeitalgorithmus für 2SAT.
Das Problem 2SAT ist das folgende Entscheidungsproblem:
Gegeben: Eine Formel F in KNF mit je zwei Literalen pro Klausel.
Frage: Hat F eine erfüllende Belegung?
Zur Erinnerung: Die logische Implikation A → B hat genau dann den Wahrheitswert
0, wenn A den Wahrheitswert 1 und B den Wahrheitswert 0 hat. Damit ist A → B
semantisch äquivalent zu ¬A ∨ B.
Wir konstruieren zu F einen Graphen GF wie folgt: Zu jeder Klausel (l ∨ l′ ) werden die
folgenden zwei (zu (l ∨ l′ ) semantisch äquivalenten) Implikationen ¬l → l′ und ¬l′ → l
als gerichtete Kanten von GF aufgenommen.
Lemma 6.1 F ist genau dann erfüllbar, wenn in GF keine Variable Ai von F zusammen mit ihrer Negation ¬Ai in einem gerichteten Kreis liegt.
Beweis: 1. “=⇒” Angenommen, in GF gibt es einen gerichteten Kreis, der eine
Variable Ai zusammen mit ihrer Negation ¬Ai enthält. Da eine gerichtete Kante
l → l′ einer Klausel ¬l ∨ l′ entspricht, bedeutet dies für eine erfüllende Belegung b von
F : ist b(l) = 1, so muß b(l′ ) = 1 sein, sonst ist die Klausel nicht erfüllt. Ist nun eine
Variable Ai von F zusammen mit ¬Ai in einem gerichteten Kreis, so gibt es einen
gerichteten Weg von Ai nach ¬Ai sowie einen gerichteten Weg von ¬Ai nach Ai . Ist
b(Ai ) = 1, so gibt es auf dem gerichteten Weg von Ai nach ¬Ai eine Kante x → y
mit b(x) = 1 und b(y) = 0, und damit ist b(F ) = 0. Ist b(Ai ) = 0, so gibt es analog auf dem gerichteten Weg von ¬Ai nach Ai eine solche Kante. Also ist F unerfüllbar.
2. “⇐=” Wir gehen nun davon aus, daß in GF keine Variable Ai von F zusammen
mit ihrer Negation ¬Ai in einem gerichteten Kreis liegt. Dies bedeutet, daß für kein
i ∈ {1, . . . , n} Ai ∼ ¬Ai ist, wobei ∼ die in Eigenschaft 6.2 definierte Äquivalenzrelation
ist.
Offenbar gilt nach Definition der Kanten in GF für Literale l, l′ : l ∼ l′ genau dann,
wenn ¬l ∼ ¬l′ , da zu jeder Kante x → y auch ¬y → ¬x Kante ist.
Wir bilden nun den in Eigenschaft 6.2 definierten Faktorgraphen G∗F von GF ; nach
Eigenschaft 6.2 (2) ist dieser ein dag. Wir wählen eine topologische Ordnung σ der
Knoten von G∗F und definieren wie folgt eine Belegung der Variablen von F : Ist für
Ai die Klasse A∗i in der σ-Ordnung links von (¬Ai )∗ (beachte, daß Ai und ¬Ai wegen
der Voraussetzung in verschiedenen Äquivalenzklassen liegen), so setze b(Ai ) := 0,
andernfalls setze b(Ai ) := 1. Wir teilen damit die Äquivalenzklassen in zwei Arten von
Klassen: x∗ ist L-Klasse, falls in der σ-Ordnung x∗ links von (¬x)∗ liegt, und x∗ ist
R-Klasse, falls in der σ-Ordnung x∗ rechts von (¬x)∗ liegt.
Wir zeigen nun, daß b eine erfüllende Belegung für F ist, d.h. b(F ) = 1. Offenbar ist
F genau dann erfüllt, wenn für keine Kante x → y in GF b(x) = 1 und b(y) = 0 ist.
14
Angenommen, es existiert doch eine Kante x → y in GF mit b(x) = 1 und b(y) = 0.
Dann ist x∗ R-Klasse und y ∗ L-Klasse, und entsprechend ist (¬x)∗ links von x∗ und
(¬y)∗ rechts von y ∗. Nun zeigt aber die Kante (¬y)∗ → (¬x)∗ in σ von rechts nach
links - Widerspruch. Damit ist gezeigt, daß die so definierte Belegung b die Formel F
erfüllt.
q.e.d.
6.2
BFS zur Bestimmung der stark zusammenhängenden
Komponenten eines gerichteten Graphen
Analog zum vorigen Abschnitt erfolgt BFS für gerichtete Graphen. Es sei Grev der
Graph, der aus dem gerichteten Graphen G durch Umkehrung der Kanten entsteht.
Algorithmus 6.4 BFS-SCC
Eingabe:
Ein gerichteter Graph G = (V, E), der durch seine Adjazenzlisten
beschrieben ist.
Ausgabe: Die stark zusammenhängenden Komponenten von G.
(0) markiere alle Knoten als unerreicht.
while es gibt noch unerreichte Knoten do
begin
(1) wähle einen noch unerreichten Knoten v und führe BFS auf G mit Startknoten v
aus (dies liefert alle von v aus erreichbaren Knoten) sowie
(2) führe BFS auf Grev von v aus (dies liefert alle Knoten, von denen aus v in G
erreicht wird).
(3) die Menge der Knoten, die in (1) und (2) von v aus erreicht werden, ist die stark
zusammenhängende Komponente, die v enthält.
end
Aufgabe:
1) Dies ist ein Linearzeitalgorithmus zur Entscheidung, ob G stark zusammenhängend
ist.
2) Ist dies ein Linearzeitalgorithmus zur Bestimmung aller stark zusammenhängenden
Komponenten?
15
6.3
Tiefensuche auf ungerichteten Graphen
Die nachfolgende DFS-Numerierung t(v) der Knoten gibt den Beginn der jeweiligen
Prozedur df s(v) an.
Prozedur 6.3 dfs(v)
(1)
(2)
(3)
(4)
(5)
i := i + 1; t(v) := i; {v ist ”erreicht” und erhält die DFS-Nummer t(v) = i}
while es existiert w ∈ N(v) mit t(w) = ∞ do
begin
N(v) := N(v) \ {w}; {Markierung in Adjazenzliste von v}
B := B ∪ {(v, w)}; {damit ist auch stets t(v) < t(w) für (v, w) ∈ B}
dfs(w);
end
Entsprechend der Wirkungsweise sich selbst rekursiv aufrufender Prozeduren gilt also:
DFSEARCH(v) ist genau dann beendet, wenn für alle w ∈ N(v), für die beim Erreichen
von v t(w) = ∞ war, DFSEARCH(w) beendet ist.
Der gesamte Algorithmus DFS lautet wie folgt:
Algorithmus 6.5 DFS(G)
Eingabe:
Ein ungerichteter Graph G = (V, E), der durch seine Adjazenzlisten
beschrieben ist.
Ausgabe: Eine Menge B von gerichteten Kanten mit der Eigenschaft, daß der B
zugrundeliegende ungerichtete Graph für jede Zusammenhangskomponente von G ein Gerüst liefert, sowie eine Numerierung (t(v))v∈V , die
die Durchlaufreihenfolge durch V bei DFS angibt.
(1)
(2)
(3)
B := ∅; i := 0;
for all v ∈ V do t(v) := ∞;
while es existiert v ∈ V mit t(v) = ∞ do dfs(v)
Definition 6.1 Es sei G = (V, E) ungerichteter Graph.
(1) Ein Knoten v ∈ V heißt Artikulationspunkt (cut vertex) in G, falls sich bei
Wegnahme von v die Zahl der Zusammenhangskomponenten erhöht.
(2) G heißt zweifach zusammenhängend (2-connected), falls G zusammenhängend ist
und keine Artikulationspunkte enthält.
(3) Maximale zweifach zusammenhängende Teilgraphen von G heißen zweifach zusammenhängende Komponenten von G.
16
Zu gegebenem zusammenhängenden ungerichteten Graphen G = (V, E) sei G′ =
(V ′ , E ′ ) der folgende bipartite Graph:
Die Knotenmenge von G′ besteht aus der Vereinigung der Menge der Artikulationspunkte einerseits sowie der Menge der zweifach zusammenhängenden Komponenten
andererseits.
Die Kantenmenge E ′ ist gegeben durch die Inzidenz der Artikulationspunkte in den
zweifach zusammenhängenden Komponenten: vQ ∈ E ′ ⇐⇒ v ∈ Q für einen cut vertex
v und eine zweifach zusammenhängende Komponente Q.
Aufgabe: Zeigen Sie: G′ ist Baum.
17
7
7.1
Minimalgerüste und Greedy-Algorithmus
Algorithmen zur Bestimmung von Minimalgerüsten
In Definition 3.1 wurde bereits der Begriff des Gerüsts eines zusammenhängenden ungerichteten Graphen G = (V, E) definiert. Hat G zusätzlich eine Kosten- oder Längenfunktion c : E → R auf der Kantenmenge, so läßt sich wie folgt der Begriff des
Minimalgerüsts definieren:
Definition 7.1 G = (V, E) sei ein zusammenhängender Graph mit einer Kantengewichtsfunktion c : E → R.
(1) Das Gewicht c(F ) einer Kantenmenge P
F ⊆ E ist definiert als die Summe der
Gewichte der Kanten aus F : c(F ) = e∈F c(e). Analog ist das Gewicht c(H)
eines Gerüsts H = (V, F ) von G definiert als das Gewicht der Kantenmenge F
von H : c(H) = c(F ).
(2) Ein Gerüst H = (V, F ) von G heißt Minimalgerüst (minimum spanning tree) von
(G, c), falls seine Kantenmenge unter allen Gerüsten von G kleinstes Gewicht hat:
c(H) = min{c(H ′ ) | H ′ Gerüst von G}.
Das nachfolgende Lemma ist die Grundlage der Algorithmen zur Bestimmung eines
Minimalgerüsts. Es ermöglicht ein rein lokales Vorgehen.
Lemma 7.1 G = (V, E) sei ein zusammenhängender ungerichteter endlicher Graph
mit Kostenfunktion c : E → R. Es sei U ⊆ V und e0 ∈ E eine Kante zwischen U und
V \ U mit minimalem Gewicht:
c(e0 ) = min{c(e) | e ∈ E ∧ e ∩ U 6= ∅ ∧ e ∩ (V \ U) 6= ∅}.
Dann existiert ein Minimalgerüst T von G, das die Kante e0 enthält.
Die nachfolgenden drei Algorithmen sind jeweils effiziente Algorithmen zur Bestimmung eines Minimalgerüsts. Dabei konstruiert der Algorithmus 7.1, von einem Startknoten ausgehend, eine wachsende Folge von Teilgerüsten, bis alle Knoten erfaßt sind.
Der Algorithmus 7.2 startet mit n Teilgerüsten, die jeweils nur einen Knoten enthalten,
und verbindet in jedem Schritt mit der Wahl einer Kante gemäß Lemma 7.1 zwei bisherige Teilgerüste. Der Algorithmus 7.3 ermöglicht ein simultanes Vorgehen und eignet
sich zur Implementation in einem parallelen Algorithmus.
18
Algorithmus 7.1 (Jarnik, Prim, Dijkstra)
Eingabe:
Ein endlicher ungerichteter zusammenhängender Graph G = (V, E) mit
V = {1, . . . , n} und eine Kostenfunktion c : E → R mit
c(i, j) = ∞ ⇐⇒ {i, j} ∈
/ E.
Ausgabe: Ein Minimalgerüst von G.
(1) t := 1; B := ∅; U := {1};
(2) for all i, j ∈ V, i 6= j, do d(i, j) := c(i, j);
(3) while U 6= V do
begin
(4)
bestimme einen Knoten u ∈ V \ U mit d(t, u) = min{d(t, v) | v ∈ V \ U};
(5)
bestimme eine Kante e = xu ∈ E mit c(e) = d(t, u) und x ∈ U;
{da G zusammenhängend ist, ist d(t, u) endlich}
(6)
B := B ∪ {e};
(7)
U := U ∪ {u};
(8)
if U 6= V then
(9)
for all v ∈ V \ U do d(t, v) := min{d(t, v), d(u, v)};
{dies ist der Abstand von v zum nächstgelegenen Knoten aus U}
{dabei steht t als ”Meta–Knoten” für ganz U}
end
Algorithmus 7.2 (Kruskal)
Ein- und Ausgabe: Wie beim Algorithmus 7.1
(1) B := ∅; MS := ∅; {MS bezeichnet das Mengensystem der Knotenmengen der
Teilgerüste}
(2) for all v ∈ V do MS := MS ∪ {{v}}; {Hinzufügen von {v} zu MS}
(3) while |MS| > 1 do
begin
(4)
Wähle eine Kante vw minimaler Länge und streiche diese in der
Liste der Kanten;
(5)
if v und w gehören zu verschiedenen Mengen W1 , W2 in MS then
begin
(6)
MS := (MS \ {W1 , W2 }) ∪ {W1 ∪ W2 }; {damit nimmt |MS| um 1 ab}
(7)
B := B ∪ {vw}
end
end
Wir definieren folgende lexikographische Ordnung für Kanten (Zur Erinnerung: Die
Knotenmenge V ist jetzt die Menge {1, . . . , n}):
Definition 7.2 Es seien {p, q}, {r, s} ∈ E mit p < q, r < s. Dann ist {p, q} < {r, s},
falls p < r oder (p = r und q < s) gilt.
19
Algorithmus 7.3 (Boruvka, Sollin)
Ein- und Ausgabe: Wie beim Algorithmus 7.1
(1) B := ∅; z := 0; MS := ∅; {MS hat dieselbe Bedeutung wie beim Algorithmus 7.2}
(2) for all v ∈ {1, . . . , n} do MS := MS ∪ {{v}};
(3) while z < n − 1 do
begin
(4)
Wähle simultan für jeden Teilbaum Ti = (Vi , Bi ) mit Vi ∈ MS
eine Kante minimaler Länge von Ti zu einem anderen Teilbaum Tj ;
if es gibt mehrere Kanten gleicher Länge von Tj aus then
(5)
wähle die im Sinne der lexikographischen Ordnung kleinste Kante von Tj ;
(6)
Füge die simultan gewählten Kanten zu B hinzu;
(7)
Bilde die entsprechenden Vereinigungsmengen in MS analog zu (5),(6) in
Algorithmus 7.2;
(8)
z := z+Zahl der simultan gewählten Kanten;
end
20
7.2
Der Greedy-Algorithmus und Matroide
Den Algorithmen 7.1, 7.2 und 7.3 ist gemeinsam, daß jeweils eine lokal beste Kante
gewählt und zur bisherigen Kantenmenge hinzugefügt wird, falls dadurch kein Kreis
entsteht. Im folgenden Algorithmus 7.4, dem sogenannten greedy-Algorithmus, wird
die Eigenschaft der Kantenmengen, kreisfrei zu sein, verallgemeinert zu einem Mengensystem J , das zunächst lediglich die Eigenschaft ∅ ∈ J erfüllen muß. Die Mengen
in J nennen wir auch unabhängige Mengen.
Algorithmus 7.4 (greedy)
Eine endliche Menge E und eine Kostenfunktion c : E → R sowie
ein Mengensystem J ⊆ P(E) mit ∅ ∈ J .
Ausgabe: Eine Menge I ∈ J .
Eingabe:
begin
(1) I := ∅;
(2) while E 6= ∅ do
begin
(3)
wähle ein e ∈ E mit c(e) = max{c(e′ ) | e′ ∈ E};
(4)
E := E \ {e};
(5)
if I ∪ {e} ∈ J then I := I ∪ {e}
end
end
Es sei c(I) =
der Null.
P
e∈E
c(e). R+
0 bezeichne die positiven rationalen Zahlen einschließlich
Definition 7.3 Der greedy–Algorithmus heißt optimal, falls für jede Kostenfunktion
′
′
c : E → R+
0 gilt: Die Ausgabemenge I ist maximal, d.h. c(I) = max{c(I ) | I ∈ J }.
Im folgenden Begriff des Matroids wird die Eigenschaft von Kantenmengen, kreisfrei
zu sein, verallgemeinert.
Definition 7.4 Es sei E eine endliche Menge und J ⊆ P(E). Das Paar M = (E, J )
mit J 6= ∅ heißt Matroid, falls es die folgenden Eigenschaften erfüllt:
(1) Für alle A ∈ J und B mit B ⊆ A gilt B ∈ J (d.h. J ist nach unten ⊆abgeschlossen).
(2) Ist A ⊆ E und I, I ′ ∈ J sind inklusionsmaximale Mengen in A, so sind I und I ′
gleichgroß.
21
Man beachte, daß in (2) nicht A ∈ J verlangt wird. Formal bedeutet (2): Sind I, I ′ ∈ J
mit I ⊆ A, I ′ ⊆ A und es existiert kein I ′′ ∈ J mit I ⊂ I ′′ ⊆ A, I ′′ 6= I, und es existiert
kein I ′′ ∈ J mit I ′ ⊂ I ′′ ⊆ A, I ′′ 6= I ′ (d.h. I, I ′ sind ⊆–maximal in A bzgl. J ), so ist
|I| = |I ′ | (d.h. I und I ′ haben dieselbe Zahl von Elementen).
Satz 7.1 Es sei E eine endliche Menge und J ⊆ P(E) ein Mengensystem mit der
Eigenschaft: J =
6 ∅ und J ist nach unten ⊆-abgeschlossen. Die folgenden Eigenschaften
sind äquivalent:
(1) Der greedy–Algorithmus ist optimal.
(2) Sind Ip , Ip+1 ∈ J mit |Ip | = p und |Ip+1 | = p + 1, so existiert ein Element e ∈
Ip+1 \ Ip mit Ip ∪ {e} ∈ J (ein solches Element e heißt auch Austauschelement).
(3) (E, J ) ist Matroid.
Beweis. (1) =⇒ (2): Angenommen, (2) wäre nicht erfüllt, d.h. es existieren Ip , Ip+1 ∈ J
mit der Eigenschaft: |Ip | = p, |Ip+1| = p + 1, und für kein e ∈ Ip+1 \ Ip ist Ip ∪ {e} ∈ J .
Wir betrachten dann folgende Kostenfunktion auf E:

 p + 2 für e ∈ Ip
p + 1 für e ∈ Ip+1 \ Ip
c(e) =

0
für e ∈
/ Ip ∪ Ip+1
Dann ist c(Ip ) = p(p + 2) = p2 + 2p und c(Ip+1 ) ≥ (p + 1)(p + 1) = p2 + 2p + 1.
Damit ist also Ip nicht optimal. Im obigen Fall wählt der greedy–Algorithmus zuerst
alle Elemente aus Ip , weil diese maximales Gewicht haben. Danach kann wegen der
Annahme, daß (2) nicht erfüllt ist, der greedy–Algorithmus das Gesamtgewicht nicht
mehr erhöhen, da für weitere Elemente x Ip ∪ {x} ∈
/ J oder c(x) = 0 ist. Dies ist ein
Widerspruch zur Optimalität des greedy–Algorithmus.
(2) =⇒ (3): I, I ′ ∈ J seien zwei in A ⊆–maximale unabhängige Mengen. Angenommen,
I und I ′ sind nicht gleichgroß – o.B.d.A. sei |I| < |I ′ |. Dann wählen wir eine Teilmenge
I ′′ ⊆ I ′ mit |I ′′ | = |I| + 1. Wegen I ′ ∈ J ist auch I ′′ ∈ J . Wegen (2) existiert dann ein
e ∈ I ′′ \ I mit I ∪ {e} ∈ J – ein Widerspruch dazu, daß I ∈ J ⊆–maximal in A war.
(3) =⇒ (1): Angenommen, der greedy–Algorithmus ist nicht optimal für J und die
Kostenfunktion c : E → R+
0 , d.h. der greedy–Algorithmus liefert als Ausgabe I =
{e1 , . . . , ei } , wobei ein I ′ = {e′1 , . . . , e′k } existiert, I ′ ∈ J , mit c(I ′ ) > c(I). Offenbar
liefert der greedy–Algorithmus eine ⊆–maximale Menge I aus J . Außerdem läßt sich
o.B.d.A. voraussetzen, daß auch I ′ eine ⊆–maximale Menge aus J ist. Also ist wegen
(3) |I| = |I ′| erfüllt. Es sei |I| = |I ′ | = k, I = {e1 , . . . , ek }, I ′ = {e′1 , . . . , e′k }.
Wir nehmen an, daß die Elemente von I bzw. I ′ nach fallendem Gewicht geordnet sind:
c(e1 ) ≥ c(e2 ) ≥ . . . ≥ c(ek ) und c(e′1 ) ≥ c(e′2 ) ≥ . . . ≥ c(e′k ).
Behauptung 7.1 Es gilt c(ei ) ≥ c(e′i ) für alle i ∈ {1, . . . , k}.
22
Induktiver Beweis der Behauptung 7.1:
Induktionsanfang: i = 1. Offenbar ist c(e1 ) ≥ c(e′1 ), da der greedy–Algorithmus
immer ein Element mit größtem Gewicht wählt.
Induktionsannahme: Für alle i ∈ {1, . . . , l − 1} gelte c(ei ) ≥ c(e′i ) für ein l ∈
{2, . . . , k}.
Induktionsschritt: Zu zeigen ist: c(el ) ≥ c(e′l ).
Angenommen, es gilt c(el ) < c(e′l ). Wir setzen A := {e | e ∈ E und c(e) ≥ c(e′l )}.
Wir behaupten, daß dann gilt:
(∗) {e1 , . . . , el−1 } ⊆–maximal in A:
Angenommen, (∗) gelte nicht, d.h., es existiert ein e ∈ E mit {e1 , . . . , el−1 , e} ⊆ A
und {e1 , . . . , el−1 , e} ∈ J . Dann folgt c(e) ≤ c(el ), da der greedy–Algorithmus stets ein
Element mit größtem Gewicht wählt. Nach der ersten Annahme gilt außerdem c(el ) <
c(e′l ), also ist c(e) < c(e′l ) – Widerspruch zu e ∈ A. Damit ist die Behauptung (∗) erfüllt.
Weiterhin gilt: {e′1 , . . . , e′l } ⊆ A und {e′1 , . . . , e′l } ∈ J . Nach der Matroideigenschaft
müssen ⊆-maximale J -Mengen in A gleichgroß sein. Wegen (∗) ist L = {e1 , . . . , el−1 }
eine solche Menge und hat l −1 Elemente. Da {e′1 , . . . , e′l } in einer ⊆–maximalen Menge
L′ in A enthalten ist, die auch mindestens l Elemente hat, folgt
l − 1 = |L| = |L′ | ≥ l
- ein Widerspruch.
q.e.d.
23
7.3
Das Steinerbaumproblem und andere Varianten des
Minimalgerüstproblems
Literatur: [M.R. Garey, D.S. Johnson, Computers and Intractability: A Guide to the
Theory of NP-Completeness, W.H. Freeman, 1979]
Beim Steinerbaumproblem werden im Graphen Zielknoten ausgewählt, die mit minimalen Kosten verbunden werden sollen. Von diesem Problem gibt es eine Reihe von
Varianten.
Definition 7.5 Es sei G = (V, E) ein zusammenhängender Graph und c : E → R eine
Kostenfunktion sowie Z ⊆ V eine ausgezeichnete Menge von Knoten (die Zielknoten
bzw. target vertices). Ein Baum T = (U, F ) mit U ⊆ V und F ⊆ E heißt Steinerbaum
für die Zielknotenmenge Z, falls gilt:
(1) Z ⊆ U (d.h. T verbindet die Zielknoten) und
(2) T hat unter allen Teilgraphen von G, die Bäume sind und Z umfassen, minimales
Gewicht.
Formal bedeutet (2):
c(H) = min{c(H ′ ) | H ′ = (U ′ , F ′), R ⊆ U ′ ⊆ V , F ′ ⊆ E und H ′ ist Baum}.
Das Steinerbaumproblem in Graphen ist das folgende algorithmische Problem:
Steiner Tree in Graphs [ND12]:
Gegeben: Ein zusammenhängender Graph G = (V, E), eine Funktion c : E → Z + ,
eine Menge Z von Zielknoten und eine positive ganze Zahl k.
Frage:
Gibt es einen Teilbaum von G, der alle Knoten in Z verbindet und
dessen Kosten ≤ k sind?
Offenbar ist im Fall Z = V ein Steinerbaum für Z gerade ein Minimalgerüst.
Schränkt man das Problem auf den Fall ungewichteter Graphen ein (d.h. c(e) = 1 für
alle e ∈ E), so gibt es folgende zwei zum Steinerbaumproblem gehörende Entscheidungsprobleme: Im ersten geht es um die Anzahl k zusätzlicher Knoten, die durch
Hinzunahme zu Z den Zusammenhang herstellen, im zweiten geht es um die Anzahl
von Kanten, die den Zusammenhang von Z herstellen.
Definition 7.6
(1) Steiner Tree(V ) := {(G, Z, k) | G = (V, E) ist zusammenhängender Graph
und Z ⊆ V und k ∈ N und es existiert ein Steinerbaum H = (U, F ) für Z mit
|U \ Z| ≤ k}
(2) Steiner Tree(E) := {(G, Z, k) | G = (V, E) ist zusammenhängender Graph
und Z ⊆ V und k ∈ N und es existiert ein Steinerbaum H = (U, F ) für Z mit
|F | ≤ k}
24
Satz 7.2 Die Probleme Steiner Tree in Graphs, Steiner Tree(V ) und Steiner
Tree(E) sind NP-vollständig.
Auch die folgenden, in [M.R. Garey, D.S. Johnson, Computers and Intractability: A
Guide to the Theory of NP-Completeness, W.H. Freeman, 1979] erwähnten Probleme
sind NP-vollständig:
Degree Constrained Spanning Tree [ND1]:
Gegeben: Ein zusammenhängender Graph G = (V, E) und eine positive ganze Zahl k.
Frage:
Gibt es ein Gerüst von G, in dem kein Knoten einen Grad > k hat?
Dieses Problem ist sogar für k = 2 NP-vollständig, weil das Problem Hamiltonpfad
NP-vollständig ist, d.h. die Frage, ob ein gegebener Graph einen Pfad hat, der jeden
Knoten genau einmal durchläuft.
Maximum Leaf Spanning Tree [ND2]:
Gegeben: Ein zusammenhängender Graph G = (V, E) und eine positive ganze Zahl k.
Frage:
Gibt es ein Gerüst von G mit mindestens k Blättern?
25
8
Maximalfluß
Eine der interessantesten Anwendungen der Graphentheorie ist die Modellierung von
Transportaufgaben in einem Netzwerk von Transportwegen (Transport von Flüssigkeiten, elektrischem Strom, von Waren, von Informationen in einem Kommunikationsnetzwerk usw.), wobei die Transportwege zwischen je zwei Knoten jeweils als gerichtete
Kanten von beschränkter Durchlaßfähigkeit (die auch Kapazität genannt wird) beschrieben werden.
Der jeweils in einer Kante fließende Fluß darf die Kapazität der Kante nicht übersteigen. Außerdem wird vorausgesetzt, daß bis auf zwei ausgezeichnete Knoten, welche die
Quelle q und die Senke s heißen, für alle Knoten v gilt, daß die Summe der in sie hineinfließenden Flüsse gleich der Summe der aus ihnen herausfließenden Flüsse ist, d.h.
die Knoten v geben tatsächlich genausoviel weiter, wie sie erhalten. Diese Eigenschaft
nennt man die Flußerhaltungseigenschaft.
Ziel ist die Bestimmung eines Flusses mit maximaler Summe der in s hineinfließenden
Flüsse; dieses Problem heißt auch Maximalflußproblem. Damit ist dies ein algorithmisches Problem auf mehrfach kantengewichteten gerichteten Graphen.
8.1
Flüsse und Schnitte
Definition 8.1 Es sei G = (V, E) gerichteter Graph. Für Knoten v ∈ V sei
Ein (v) = {(u, v) | (u, v) ∈ E} die Menge der in v einlaufenden Kanten und
Eout (v) = {(v, u) | (v, u) ∈ E} die Menge der von v ausgehenden Kanten.
Definition 8.2 N = (G, q, s, c) heißt Netzwerk, falls gilt:
(α) G = (V, E) ist gerichteter endlicher schlichter Graph.
(β) q und s sind spezielle Knoten in V mit q 6= s (q heißt Quelle, s heißt Senke).
(γ) c : E → R+ ist eine Kantengewichtsfunktion (die Kapazität c(e) von Kante
e ∈ E) mit c(e) > 0 für alle e ∈ E.
Definition 8.3 Es sei N = (G, q, s, c) ein Netzwerk.
(1) Eine Funktion f : E → R+ heißt zulässiger Fluß auf N (oder kürzer: Fluß ), falls
gilt:
(F 1) Für alle e ∈ E ist 0 ≤ f (e) ≤ c(e).
(F 2) Für alle v ∈ V \ {q, s} ist
P
P
(δ) 0 = e∈Ein (v) f (e) − e∈Eout (v) f (e).
26
(2) Wir setzen
f + (v) =
f − (v) =
P
e∈Ein (v)
f (e) und
P
e∈Eout (v)
f (e).
(3) Der Gesamtfluß F = F (f ) ist definiert durch
(ε) F = f + (s) − f − (s)
(4) Der Fluß f auf N heißt Maximalfluß auf N, falls der Gesamtfluß von f maximal
ist, d.h. F (f ) = max{F (f ′ ) | f ′ Fluß auf N} gilt.
Falls es keine von s ausgehenden Kanten in E gibt, ist f − (s) = 0, aber in Definition
8.2 wird nicht Eout (s) = ∅ verlangt.
Definition 8.4 Das Maximalflußproblem ist die folgende (algorithmische) Aufgabe:
Eingabe:
Gesucht:
Ein Netzwerk N.
Ein Maximalfluß f auf N.
Definition 8.5 Es sei S ⊆ V mit q ∈ S, s ∈
/ S und S = V \ S. Wir definieren
(1) (S; S) = {(x, y) : (x, y) ∈ E ∧ x ∈ S ∧ y ∈ S},
(2) (S; S) = {(x, y) : (x, y) ∈ E ∧ x ∈ S ∧ y ∈ S}.
(3) Der durch S definierte Schnitt ist die Kantenmenge (S; S) ∪ (S; S).
Im weiteren wird oft auch von S selbst als Schnitt gesprochen, wobei der durch S
definierte Schnitt gemeint ist. Das folgende Lemma zeigt: Der Gesamtfluß F (f ) läßt
sich nicht nur an der Senke s, sondern auch an jedem Schnitt S messen als die folgende
Differenz von Summen von Flüssen.
Lemma 8.1 Für jedes S ⊆ V mit q ∈ S, s ∈
/ S gilt
X
e∈(S;S)
f (e) −
X
f (e) = F (f ).
e∈(S;S)
Beweis. WirP
summieren (ε) mit den Gleichungen (δ) für alle v ∈ S \ {s}. Damit ergibt
sich F (f ) = v∈S (f + (v) − f − (v)).
Es sei nun e = (x, y) eine Kante. Für e ergibt sich folgende Fallunterscheidung:
1. Fall: Ist x, y ∈ S, so kommt f (e) auf der rechten Seite nicht vor.
2. Fall: Ist x, y ∈ S, so kommt f (e) rechts einmal mit dem Vorzeichen ”+” vor (als
einlaufende Kante zu y) und einmal mit dem Vorzeichen ”−” vor (als auslaufende
27
Kante zu x), die Summe ist also 0.
3. Fall: Ist x ∈ S, y ∈ S, so kommt f (e) einmal mit dem Vorzeichen ”+” vor als
einlaufende Kante zu y. (Ist dabei y = s, so kommt f (e) in (ε) vor, ist y 6= s, so kommt
f (e) in (δ) vor.)
4. Fall: Ist x ∈ S, y ∈ S, so kommt f (e) einmal mit dem Vorzeichen ”−” vor als
auslaufende Kante zu x. (Ist x = s, so kommt f (e) in (ε) vor, ist x 6= s, so kommt f (e)
in (δ) vor.)
Damit gilt Lemma 8.1.
q.e.d.
Definition 8.6 Die Kapazität c(S) eines durch S bestimmten Schnittes ist
c(S) =
P
e∈(S;S)
c(e).
Offenbar gilt stets F ≤ c(S), denn
F =
X
e∈(S;S)
f (e) −
X
f (e) ≤
e∈(S;S)
X
e∈(S;S)
f (e) ≤
X
c(e).
e∈(S;S)
Das heißt insbesondere
(ζ) max{F (f ) | f Fluß auf N} ≤ min{c(S) | S ⊆ V und q ∈ S und s ∈
/ S}.
Tritt hierbei Gleichheit ein, so ist offenbar F maximal (und c(S) minimal). Algorithmen
zur Bestimmung des Maximalflusses beruhen darauf, daß bei (ζ) tatsächlich Gleichheit
eintritt (diese Gleichheit ist unter dem Namen max-flow-min-cut theorem bekannt geworden und wird als Satz 8.2 formuliert und bewiesen).
28
8.2
Der Algorithmus von Ford/Fulkerson
Definition 8.7 Es sei P = (e1 , . . . , ek ) mit ei ∈ E, i ∈ {1, . . . , k}, eine Kantenfolge im gerichteten Graphen G, deren zugrundeliegende ungerichtete Kantenfolge
P ′ = (e′1 , . . . , e′k ) ein einfacher Weg zwischen Quelle q und Senke s ist (d.h. die gerichteten Kanten können im Weg P ′ in Richtung von q nach s oder in Richtung von s
nach q gerichtet sein). Es sei also
e′1
e′2
e′k−1
e′k
P ′ = x0 — x1 — . . . — xk−1 — xk mit x0 = q und xk = s.
(1) Eine Kante xi−1 → xi heißt Vorwärtskante in P und
(2) eine Kante xi−1 ← xi heißt Rückwärtskante in P .
Im weiteren bezeichnen wir auch Kantenfolgen wie in Definition 8.7 als Wege. Eine
Vorwärtskante zeigt also in P in Richtung von q nach s, und eine Rückwärtskante zeigt
in P in Richtung von s nach q. Eine Kante e kann in Bezug auf einen Weg P1 Vorwärtsund in Bezug auf einen anderen Weg P2 Rückwärtskante sein.
Definition 8.8 Es sei P = (e1 , . . . , ek ) eine Kantenfolge wie in Definition 8.7 und f
eine Flußfunktion auf N.
(1) Der Nutzen der Kante ei sei
∆(ei ) :=
c(ei ) − f (ei )
f (ei )
falls ei Vorwärtskante in P ist
falls ei Rückwärtskante in P ist
(2) Eine Kante ei in P heißt nützlich in P , falls ∆(ei ) > 0 ist.
(3) Ein Weg P heißt flußvergrößernder Weg, falls alle seine Kanten nützlich sind,
d.h. ∆(P ) := min{∆(ei ) | ei Kante in P , i ∈ {1, . . . , k}} > 0.
Mit Hilfe eines flußvergrößernden Weges P läßt sich folgende neue Flußfunktion f ′ zu
f definieren, deren Gesamtfluß F (f ′) größer als F (f ) ist:
Definition 8.9

 f (e) + ∆(P )
′
f (e) − ∆(P )
f (e) :=

f (e)
falls e Vorwärtskante in P ist
falls e Rückwärtskante in P ist
falls e nicht in P vorkommt
Lemma 8.2 Die so definierte Funktion f ′ ist zulässige Flußfunktion auf N mit Gesamtfluß F (f ′) = F (f ) + ∆(P ).
29
Beweis. Im folgenden setzen wir ∆ = ∆(P ). Offenbar ist für alle Kanten e ∈ E
0 ≤ f ′ (e) ≤ c(e) erfüllt. Eigenschaft (F2) eines zulässigen Flusses ist ebenfalls erfüllt,
da f nur entlang des Weges P verändert wird:
Ist x ein Knoten im Weg P , so können nur folgende vier Fälle eintreten:
e
e
1
2
(1) . . . −→
x −→
. . ., e1 , e2 Vorwärtskanten. Dann ist
f ′+ (x) = f + (x) + ∆ und f ′− (x) = f − (x) + ∆, also f ′+ (x) − f ′− (x) = 0.
e
e
1
2
(2) . . . ←−
x ←−
. . ., e1 , e2 Rückwärtskanten. Dann ist
f ′+ (x) = f + (x) − ∆ und f ′− (x) = f − (x) − ∆.
e
e
1
2
(3) . . . −→
x ←−
. . ., e1 Vorwärtskante, e2 Rückwärtskante. Dann ist
f ′− (x) = f − (x) und f ′+ (x) = f + (x) + ∆ − ∆.
e
e
1
2
(4) . . . ←−
x −→
. . . , e1 Rückwärtskante, e2 Vorwärtskante. Dann ist
f ′+ (x) = f + (x) und f ′− (x) = f − (x) − ∆ + ∆.
In jedem Fall gilt also (F2) für f ′ . Offenbar gilt für die Gesamtflüsse: F (f ′ ) = F (f )+∆.
q.e.d.
Algorithmus 8.1 (Ford, Fulkerson)
Eingabe: Ein Netzwerk N = (G, q, s, c)
Ausgabe: Ein Maximalfluß f .
(1) for all e ∈ E do f (e) := 0;
(2) while es existiert ein flußvergrößernder Weg P do
begin
(3)
konstruiere einen flußvergrößernden Weg P ;
(4)
bilde zu f und P die Flußfunktion f ′ wie in Definition 8.9;
(5)
setze f := f ′ ;
end
Satz 8.1 Falls der Algorithmus 8.1 anhält, ist f ein Maximalfluß.
Beweis. Der Algorithmus hält genau dann, wenn es keinen flußvergrößernden Weg in
N mit Flußfunktion f mehr gibt. Es sei S die Menge der Knoten x, die von q aus über
eine (möglicherweise leere) Folge von nützlichen Kanten erreichbar ist (d.h. also über
Kanten e = u → v mit f (e) < c(e) bzw. über Kanten e = u ← v mit f (e) > 0). Nach
Definition von S ist q ∈ S. Da es keinen flußvergrößernden Weg zu N und f gibt, ist
s ∈
/ S. Also definiert S einen Schnitt: Ist e = (u, v) ∈ (S; S), so ist f (e) = c(e), ist
30
e = (v, u) ∈ (S; S), so ist f (e) = 0, andernfalls wäre auch v ∈ S. Da nach Lemma 8.1
für jeden Schnitt S
X
f (e) −
e∈(S;S)
X
f (e) = F (f )
e∈(S;S)
gilt, ist somit
F (f ) =
X
c(e) − 0 = c(S).
e∈(S;S)
Damit wird in der Ungleichung F (f ) ≤ c(S) Gleichheit erreicht, und somit ist f Maximalfluß.
q.e.d.
Satz 8.2 (max–flow–min–cut theorem) In Netzwerken mit ganzzahligen Kapazitäten ist der maximale Gesamtfluß F ganzzahlig und wird nach endlich vielen Schritten in Algorithmus 8.1 durch F = c(S) für eine Schnittmenge S erreicht.
Beweis. Der Anfangsfluß ist f (e) = 0 für alle e ∈ E. Ist P ein flußvergrößernder Weg,
so ist wegen der ganzzahligen Kapazitäten c(ei ) für jede Kante ei aus P auch ∆(ei ) aus
Definition 8.8 ganzzahlig, und damit bleiben auch die Flüsse auf den Kanten sowie der
Gesamtfluß ganzzahlig. Da der maximale Gesamtfluß auch ganzzahlig ist (er ist z.B.
durch die Kapazität irgendeines Schnittes beschränkt) und durch endlichmalige ganzzahlige Erhöhung eines Gesamtflusses entsteht, bricht Algorithmus 8.1 nach endlich
vielen Schritten ab.
q.e.d.
Für beliebige Kapazitäten gilt der obige Satz nicht. Tatsächlich haben Ford und
Fulkerson Beispiele mit irrationalen Kapazitäten konstruiert, für die der Algorithmus
nicht hält.
Daß im Fall ganzzahliger Kapazitäten Algorithmus 8.1 nach endlich vielen Schritten
abbricht, besagt noch nichts über die Zeitschranke des Algorithmus. Diese kann in der
Tat sehr schlecht sein, wenn die flußvergrößernden Wege ungeschickt gewählt werden.
31
8.3
Der Algorithmus von Dinitz
Wir beschreiben in diesem Abschnitt einen einfachen, von Dinitz stammenden Polynomialzeitalgorithmus zur Lösung des Maximalflußproblems, der auf der folgenden Idee
beruht:
Es werden wiederholt flußvergrößernde Wege kürzester Länge bestimmt, und zwar jeweils in einem dafür konstruierten, noch zu definierenden, Schichtennetzwerk. Ist der
Fluß in einem solchen Netzwerk jeweils gesättigt, so versucht der Algorithmus von
Dinitz ein neues solches Netzwerk zu konstruieren, das dann flußvergrößernde Wege
größerer Länge liefert, bis Maximalfluß erreicht ist. Der Algorithmus von Dinitz arbeitet in drei Phasen. Grundlage dieses Vorgehens ist BFS in Phase 1 sowie DFS in Phase
2.
Phase 1:
Algorithmus 8.2
(Konstruktion der Schichten V0 , . . . , Vl des Netzwerkes Ñ)
Eingabe: Ein Netzwerk N = (G, q, s, c) mit Flußfunktion f
Ausgabe: V0 , . . . , Vl – die Schichten von Ñ
(Das vollständige Netzwerk Ñ wird im Anschluß an den Algorithmus definiert.)
(1) V0 := {q}; i := 0;
(2) repeat
S
(3)
T := {v : v ∈
/ j≤i Vj und es existiert ein y ∈ Vi mit
(e = (y, v) ∈ E ∧ f (e) < c(e)) {nützliche Vorwärtskante} oder
(e = (v, y) ∈ E ∧ f (e) > 0)}; {nützliche Rückwärtskante}
(4)
if s ∈ T then
begin
(5)
l := i + 1; Vl := {s}
end
else
begin
(6)
Vi+1 := T ; i := i + 1
end
(7) until (T = ∅) or (s ∈ T );
Definition 8.10 Es seien V0 , . . . , Vl die durch Algorithmus 8.2 definierten Schichten
und für alle i ∈ {1, . . . , l}
Ei = {e | e ∈ E und e ist nützliche (Vorwärts– oder Rückwärts–) Kante
von Vi−1 nach Vi }.
32
Weiterhin sei Ẽi folgende Kantenmenge:
{(x, y) | x ∈ Vi−1 ∧ y ∈ Vi ∧ (x, y) nützliche Vorwärtskante in Ei }
∪ {(x, y) | x ∈ Vi−1 ∧ y ∈ Vi ∧ (y, x) nützliche Rückwärtskante in Ei }
Ẽi =
(d.h. in Ẽi haben die Kanten aus Ei jetzt alle die Richtung von Vi−1 nach Vi , auch
wenn sie vorher umgekehrte Richtung hatten).
Wir setzen
Ẽ =
Sl
i=1
Ẽi .
Außerdem sei
c̃(e) =
c(e) − f (e) falls e nützliche Vorwärtskante in N ist
f (e)
falls e nützliche Rückwärtskante in N ist
Das Netzwerk Ñ = ((V, Ẽ), q, s, c̃) mit V = V0 ∪ . . . ∪ Vl und {s} = Vl heißt Schichtennetzwerk (”layered network”) mit den Schichten V0 , . . . , Vl . Die Tiefe des Netzwerks Ñ
ist l.
Im Algorithmus 8.2 werden also Schicht für Schicht nützliche Kanten bestimmt, bis
T = ∅ ist (der Algorithmus bricht erfolglos ab) oder s ∈ T erreicht ist (der Algorithmus
hat ein neues Schichtennetzwerk gefunden).
Endet der Algorithmus mit s ∈ T , so besteht die Möglichkeit, den Gesamtfluß weiter
zu erhöhen. Der Zeitaufwand von Algorithmus 8.2 ist O(|V | + |E|), da der Algorithmus
eine Modifikation von Breitensuche (BFS) ist, bei der lediglich der Test auf Nützlichkeit
der Kanten hinzukommt.
Lemma 8.3 Endet Algorithmus 8.2 mit T = ∅, so ist der gegenwärtige Gesamtfluß
F (f ) maximal.
Beweis: Es seien V0 , . . . , Vi alle Schichten des Netzwerks. Setze S = V0 ∪ . . . . ∪ Vi .
Dann ist q ∈ S, s ∈
/ S, und es gilt:
Für jede Kante e = (u, v) in (S; S) ist f (e) = c(e), und für jede Kante e = (v, u) in
(S; S) ist f (e) = 0. Nach Lemma 8.1 ist dann
F =
X
e∈(S;S)
f (e) −
X
f (e) =
e∈(S;S)
X
c(e) − 0 = c(S).
e∈(S;S)
Also ist F maximal.
q.e.d.
Definition 8.11 Die Flußfunktion f˜ im Schichtennetzwerk Ñ heißt wegsättigend
(”blocking”) gdw.
33
für alle Wege P von q nach s in Ñ gibt es eine Kante e mit f˜(e) = c̃(e) (d.h.
entlang des Weges P kann keine Flußvergrößerung mehr erfolgen).
Die Idee des Algorithmus von Dinitz ist die folgende: Im Schichtennetzwerk Ñ wird
eine wegsättigende Flußfunktion f˜ bestimmt und zum bisherigen Fluß f addiert, falls
dieser nicht maximalen Gesamtfluß hatte. Dieser Schritt wird solange wiederholt, bis
man bei Algorithmus 8.2 T = ∅ erreicht. Die Zahl der Iterationen ist dabei durch |V |
beschränkt, da man zeigen kann, daß bei jeder Iteration die Tiefe (d.h. die maximale
Weglänge) des Schichtennetzwerks um mindestens 1 wächst (und höchstens |V | werden
kann).
34
Phase 2:
Der nachfolgende Algorithmus verwendet Kantenmarkierungen ”frei” und ”blockiert”
(im Sinne von ”nicht frei”).
Algorithmus 8.3 (Bestimmung eines wegsättigenden Flusses f˜ zu Ñ)
Eingabe:
Ein Schichtennetzwerk Ñ = (G̃, q, s, c̃), G̃ = ((V0 , . . . , Vl ), Ẽ), mit c̃(e) > 0
für alle e ∈ Ẽ.
Ausgabe: Ein wegsättigender Fluß f˜ auf Ñ.
(1) for all e ∈ Ẽ do begin markiere e ”frei”; f˜(e) := 0 end;
(2) repeat
(3)
v := q; K := ∅; {K ist ein Kellerspeicher (stack)}
(4)
repeat
(5)
while es existiert freie Kante v → u do
(6)
begin speichere v → u in K ein; setze v := u end;
(7)
if v = s then
el−1
el
e1
e2
{die Kanten in K bilden flußvergrößernden Weg q −→
v1 −→
s}
. . . −→ vl−1 −→
begin
(8)
∆ := min{c̃(ei ) − f˜(ei ) : 1 ≤ i ≤ l};
(9)
for all i mit 1 ≤ i ≤ l do
begin
(10)
f˜(ei ) := f˜(ei ) + ∆;
(11)
if f˜(ei ) = c̃(ei ) then markiere ei als ”blockiert”;
{dabei wird für jeden solchen Weg mindestens eine Kante blockiert}
end
end
(12)
else
{es existiert keine freie Kante von v 6= s aus, d.h. v ist Ende einer Sackgasse}
(13)
begin
lösche oberste Kante e = u → v aus K;
markiere e ”blockiert”;
setze v := u; {backtracking um eine Kante}
end
(14) until (v = q) or (v = s);
(15) until (v = q) and (alle Kanten von q aus sind blockiert)
35
Phase 3 (Flußvergrößerung):
Algorithmus 8.4
Eingabe: Bisherige Flußfunktion f auf N, wegsättigende Flußfunktion f˜ auf Ñ
Ausgabe: Flußfunktion f ′ auf N
for all Kanten e in N do
begin
(1)
if e = u → v Kante in Ñ mit u ∈ Vj−1 , v ∈ Vj then
f ′ (e) := f (e) + f˜(e);
(2)
if e = u → v Kante in Ñ mit u ∈ Vj , v ∈ Vj−1 then
f ′ (e) := f (e) − f˜(e);
(3)
if e = u → v keine Kante in Ñ then
f ′ (e) := f (e)
end;
Algorithmus 8.5 (Dinitz)
Eingabe: Ein Netzwerk N = (G, q, s, c) mit G = (V, E)
Ausgabe: Ein Maximalfluß f
(1)
(2)
(2.1)
(2.2)
(2.3)
(2.4)
for all e ∈ E do f (e) := 0;
repeat
führe Algorithmus 8.2 aus;
führe Algorithmus 8.3 aus;
führe Algorithmus 8.4 aus mit Ausgabe f ′ ;
setze f := f ′ ;
until T = ∅ in Algorithmus 8.2
Lemma 8.4 Endet Algorithmus 8.2 mit T = ∅, so ist der gegenwärtige Gesamtfluß
F (f ) maximal.
Lemma 8.5 Es seien lk , lk+1 die Tiefen (d.h. die maximalen Weglängen) zweier in Algorithmus 8.5, (2.1) aufeinanderfolgender Schichtennetzwerke Nk , Nk+1 . Ist Nk+1 nicht
das letzte Schichtennetzwerk in der Ausführung von Algorithmus 8.5, so ist lk+1 > lk .
Folgerung 8.1 Algorithmus 8.5 ist in Zeit O(|V |2 · |E|) ausführbar.
36
9
9.1
Unabhängige Knoten- und Kantenmengen
Die Probleme Vertex Cover, Maximum Independent Set
und Maximum Clique
In Konfliktgraphen, in denen Kanten zwischen Knoten existieren, die um gemeinsame
Ressourcen konkurrieren, ist es wichtig, konfliktfreie Knotenmengen zu betrachten.
Diese heißen in der folgenden Definition unabhängige Knotenmengen.
Definition 9.1 Es sei G = (V, E) endlicher ungerichteter Graph.
(1) Eine Knotenmenge U ⊆ V heißt unabhängige Knotenmenge, wenn für alle
x, y ∈ U xy ∈
/ E gilt. Es bezeichne α(G) die maximale Größe einer unabhängigen
Knotenmenge in G.
(2) Analog heißt eine Knotenmenge Clique in G, falls sie im Komplementgraphen
G unabhängige Knotenmenge ist. Es bezeichne ω(G) die maximale Größe einer
Clique in G.
(3) Eine Knotenmenge U ⊆ V heißt Knotenüberdeckung (vertex cover, Überdeckung
aller Kanten durch Knoten), wenn für alle Kanten e ∈ E gilt: e ∩ U 6= ∅. Es
bezeichne β(G) die kleinste Größe einer Knotenüberdeckung von G.
Das Problem, ein möglichst kleines vertex cover eines Graphen zu bestimmen, ist eines
der wichtigsten Graphenprobleme. Um dies zu illustrieren, geben wir folgendes Beispiel
an: Die Matrix in Abbildung 1 zeigt mit dem Symbol ? markierte Zellen, die fehlerhaft
sind und durch Austausch von (möglichst wenigen) ganzen Zeilen oder Spalten repariert
werden sollen.
Die fehlerhaften Zellen werden in Abbildung 1 durch Kanten in einem (bipartiten)
Graphen B = (X, Y, E) dargestellt mit den Knotenmengen X = {x1 , x3 , x4 , x7 } (für
1
2
3
4
5
6
7
1 2
?
3
4
?
5 6
7
8 9
?
x1
x3
?
?
?
?
x4
x7
?
?
y1
y2
y4
y7
y9
Abbildung 1: Ein reconfigurable array mit fehlerhaften Zellen und der dazugehörige
bipartite Graph.
37
die Zeilen, die eine fehlerhafte Zelle enthalten) sowie Y = {y1 , y2 , y4, y7 , y9 } (für die
Spalten, die eine fehlerhafte Zelle enthalten). Es ist xi yj ∈ E genau dann, wenn die
Zelle in Zeile i und Spalte j fehlerhaft ist; so ist z.B. x1 y4 ∈ E. Das Problem der
Überdeckung aller fehlerhaften Zellen durch Zeilen bzw. Spalten entspricht also genau
dem Problem, ein vertex cover in B zu bestimmen; z.B. ist x4 , y1 , y4 , y9 ein vertex cover,
dargestellt durch die eingekreisten Knoten in Abbildung 1.
Eigenschaft 9.1 Es sei G = (V, E) ungerichteter endlicher Graph. Dann gilt: S ⊆ V
ist genau dann unabhängige Knotenmenge, wenn V \ S Knotenüberdeckung ist.
Beweis. Ist S unabhängig, so gilt für jede Kante e = uv ∈ E für die Knoten u ∈ V \ S
oder v ∈ V \ S, d.h. V \ S ist Knotenüberdeckung und umgekehrt.
q.e.d.
Es ist also α(G) = ω(G) und α(G) + β(G) = |V |. Dies zeigt, wie eng alle drei Begriffe
zusammenhängen.
Leider sind die folgenden Probleme NP-vollständig:
Vertex Cover [GT1]:
Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k.
Frage:
Gibt es eine Knotenüberdeckung von G mit ≤ k Knoten?
Maximum Independent Set [GT20]:
Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k.
Frage:
Gibt es eine unabhängige Knotenmenge von G mit ≥ k Knoten?
Maximum Clique [GT19]:
Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k.
Frage:
Gibt es eine Clique von G mit ≥ k Knoten?
Literatur: [M.R. Garey, D.S. Johnson, Computers and Intractability. A Guide to the
Theory of NP-Completeness. Freeman 1979]
Satz 9.1 VERTEX COVER ist NP-vollständig.
Beweis. Daß VERTEX COVER in NP liegt, läßt sich leicht zeigen, indem in nichtdeterministischer Polynomialzeit eine Teilmenge V ′ ⊆ V mit |V ′ | ≤ k “geraten” wird und
anschließend in (deterministischer) Polynomialzeit geprüft wird, ob die geratene Menge
V ′ eine Knotenüberdeckung von G darstellt. Es existiert genau dann ein erfolgreicher
Berechnungsweg, wenn der Graph eine Knotenüberdeckung V ′ mit |V ′ | ≤ k besitzt.
Wir zeigen nun: 3SAT ≤p VERTEX COVER:
Es sei F = C1 ∧ . . . ∧ Cm eine KNF mit den Variablen x1 , . . . , xn und höchstens 3
Literalen pro Klausel: O.B.d.A. enthalte jede Klausel genau drei Literale – ist dies
nicht der Fall, so lassen sich die Klauseln in aussagenlogisch äquivalenter Weise leicht
auf diese Zahl erweitern.
Wir konstruieren einen Graphen GF = (V, E) wie folgt:
38
x1
a1
-x1
x2
b1
-x2
c1
x3
a2
-x3
b2
x4
c2
-x4
Abbildung 2: Der Graph GF für die Formel F = (x1 ∨ ¬x3 ∨ ¬x4 ) ∧ (¬x1 ∨ x2 ∨ ¬x4 ).
(1) Für jede Variable xi , i ∈ {1, . . . , n}, enthält GF eine Kante {xi , −xi }.
(2) Für jede Klausel Cj , j ∈ {1, . . . , m}, enthält GF ein Dreieck mit den Knoten
aj , bj , cj .
(3) Die Knoten aj , bj , cj werden jeweils durch eine Kante mit den jeweiligen Literalknoten von Cj verbunden, und zwar aj mit dem ersten, bj mit dem zweiten und cj
mit dem dritten Literalknoten von Cj . Diese Kanten heißen Verbindungskanten.
Ein Beispiel ist in Abbildung 2 gegeben.
Behauptung: F ist genau dann erfüllbar, wenn der Graph GF ein vertex cover mit
n + 2m Knoten hat.
a) Falls V ′ Knotenüberdeckung von GF ist, enthält V ′ von jeder Kante {xi , −xi } mindestens einen Knoten, d.h. mindestens n solche Knoten, und von jedem Dreieck mit
den Knoten aj , bj , cj mindestens 2 Knoten, d.h. mindestens 2m solche Knoten. Jede
Knotenüberdeckung von GF hat also mindestens n + 2m Knoten.
b) Ist b eine erfüllende Belegung von F , so wähle für ein vertex cover bei den Kanten
{xi , −xi } diejenigen Knoten, die erfüllten Literalen entsprechen. Diese überdecken gewisse Verbindungskanten mit. Es sind also nur noch jeweils zwei Knoten in jedem der
m Dreiecke geeignet zu wählen, um alle Kanten zu überdecken.
c) Existiert eine Knotenüberdeckung V ′ mit n + 2m Knoten, so setze b(xi ) = 1 genau
dann, wenn xi ∈ V ′ ist. Da V ′ Knotenüberdeckung ist, also die Verbindungskanten
mit überdeckt, aber aus jedem Sunter (2) definierten Dreieck nur 2 Knoten enthält,
überdeckt ein Knoten aus V ′ ∩ ni=1 {xi , −xi } jeweils eine Verbindungskante mit, d.h.
Cj wird bei b erfüllt, j ∈ {1, . . . , m}. Also ist b eine erfüllende Belegung von F . q.e.d.
39
Die NP-Vollständigkeit von VERTEX COVER bedeutet nicht, daß das oben beschriebene Problem der Fehlerkorrektur bei reconfigurable arrays auch NP-vollständig ist:
Aus dem nachfolgenden Satz 9.3 von D. König folgt, daß das VERTEX COVER Problem auf bipartiten Graphen (als eine Anwendung von Maximalflußalgorithmen) in
Polynomialzeit lösbar ist.
9.2
Maximum Matching: Paarungen und ihre Bestimmung in
paaren Graphen
Definition 9.2 Es sei G = (V, E) ungerichteter Graph.
(1) Eine Kantenmenge E ′ ⊆ E heißt Paarung bzw. Zuordnung (unabhängige Kantenmenge, matching) in G, falls gilt: für alle e, e′ ∈ E ′ mit e 6= e′ gilt e ∩ e′ = ∅
(d.h. je zwei verschiedene Kanten aus E ′ haben keinen Knoten gemeinsam).
(2) Wir setzen αE (G) = max{|E ′ | : E ′ Zuordnung in G}.
(3) Eine Zuordnung E ′ in G heißt vollständige Zuordnung (perfect matching) in G,
falls gilt: |E ′ | = |V2 | (d.h. für alle v ∈ V existiert ein e ∈ E ′ mit v ∈ e).
(4) Eine Zuordnung E ′ in G heißt größte Zuordnung (maximum matching) in G,
falls gilt: |E ′ | = αE (G).
(5) Das Zuordnungsproblem (maximum matching problem) für G ist die Bestimmung einer größten Zuordnung in G. Das Zuordnungsproblem in paaren Graphen
wird auch als Heiratsproblem bezeichnet.
Wir zeigen nun im folgenden, daß das Zuordnungsproblem für paare Graphen B =
(X, Y, E) auf das Maximalflußproblem zurückführbar ist. Dazu wird folgendes Netzwerk
N = N(B) konstruiert:
N = (V̂ , Ê, q, s, c) mit q, s ∈
/ X ∪Y
V̂ = {q, s} ∪ X ∪ Y
Ê = {(q, x) | x ∈ X} ∪ {(y, s) | y ∈ Y } ∪ {(x, y) | xy ∈ E ∧ x ∈ X ∧ y ∈ Y }
c(e) = 1 für alle e ∈ E.
Satz 9.2 Es sei F der Maximalfluß in N(B). Dann ist αE (B) = F .
Beweis. Es sei M eine Zuordnung maximaler Größe in B. Für jede Kante x → y,
x ∈ X, y ∈ Y , mit xy ∈ M setze den Fluß auf dieser Kante gleich 1. Gleichzeitig wird
der Fluß auf q → x und y → s gleich 1 gesetzt. Auf den restlichen Kanten e ist f (e) = 0.
Offenbar definiert dies eine zulässige Flußfunktion, deren Gesamtfluß gleich αE (B) ist.
Also ist F ≥ αE (B).
40
Für die Umkehrung setzen wir o.B.d.A. voraus, daß F ganzzahlig ist – sind die Kapazitäten ganzzahlig, so ist es auch F . Also haben F Kanten von Knoten aus Y nach s
den Fluß 1. Da für y ∈ Y outdeg(y) = 1 ist, existiert nur jeweils eine Kante nach y mit
Fluß 1. Wir setzen nun M = {xy | der Fluß von x nach y ist 1 }.
Für x ∈ X ist indeg(x) = 1, also hat nur jeweils eine von x ausgehende Kante den Fluß
1. Damit ist M eine Zuordnung mit |M| = F , d.h. αE (B) = F .
q.e.d.
Folgerung 9.1 Das Zuordnungsproblem für paare Graphen B = (X, Y, E) läßt sich in
O((|X| + |Y |) · |E|) Schritten lösen.
Beweis. Das Netzwerk N(B) für paare Graphen B ist von der oben beschriebenen
speziellen Form. Insbesondere ist c(e) = 1 für alle e ∈ E, was zur Folge hat, daß im
Algorithmus von Dinitz in flußvergrößernden Wegen jeweils nicht nur eine, sondern
alle Kanten des Weges blockiert werden. Also braucht man für die Ausführung des
Algorithmus 8.3 nur O(|E|) (statt O(|V | · |E|)) Schritte, also insgesamt nur O(|V | · |E|)
(statt O(|V |2 · |E|)) Schritte.
q.e.d.
Satz 9.3 (Satz von König) Für paare Graphen B = (X, Y, E) gilt
αE (B) = βV (B),
d.h. die Maximalgröße einer Zuordnung ist gleich der Minimalgröße einer Knotenüberdeckung.
Beweis. 1. Wir zeigen zunächst αE (B) ≤ βV (B): Es sei E ′ ⊆ E eine Zuordnung in B.
Für jede Knotenüberdeckung V ′ von B gilt dann |V ′ | ≥ |E ′ |, da V ′ von jeder Kante
e ∈ E ′ mindestens einen Knoten enthalten muß. Also ist αE (B) ≤ βV (B).
2. Nun zeigen wir αE (B) ≥ βV (B): Nach Satz 9.2 ist αE (B) = F für einen Maximalfluß
F in N(B) (zur Erinnerung: Alle Kanten in N(B) haben Kapazität 1), und nach dem
max–flow–min–cut theorem (Satz 8.2) ist
F = min{c(S) | S definiert einen Schnitt von N(B)}.
Es sei nun S ein minimaler Schnitt, d.h. c(S) = F = αE (B). Wegen indeg(x) = 1 für
x ∈ X, outdeg(y) = 1 für y ∈ Y sind o.B.d.A. Kanten e ∈ (S; S) von der Form e =
(q, x) für ein x ∈ X oder e = (y, s) für ein y ∈ Y : Im Falle e = (x, y) ∈ (S; S) ∩ (X × Y )
ließe sich durch S ′ = S \ {x}, S ′ = S ∪ {x} ein neuer Schnitt definieren, der nicht mehr
Kanten enthält als (S; S):
c(S ′ ) ≤ c(S).
Wir setzen nun V ′ := (S ∩Y )∪(S ∩X). Angenommen, V ′ ist keine Knotenüberdeckung.
Dann ist für ein e = {x, y} ∈ E mit x ∈ X, y ∈ Y y ∈
/ S und x ∈
/ S, d.h. x ∈ S, y ∈ S,
41
d.h. (S; S) enthält entgegen der Annahme doch eine Kante (x, y) – Widerspruch. Also
ist V ′ Knotenüberdeckung und
βV (B) ≤ |V ′ | = c(S) = F = αE (B).
q.e.d.
9.3
Knotenfärbungen von Graphen
Es sei G = (V, E) ein endlicher ungerichteter Graph. Eine Zerlegung der Knotenmenge
V in unabhängige Mengen V1 , . . . , Vk heißt zulässige k-Färbung von G. Die chromatische
Zahl χ(G) von G ist das kleinste k, für das G eine zulässige k-Färbung hat. Offenbar ist
G genau dann bipartit, wenn χ(G) ≤ 2 ist. Dies ist leicht zu entscheiden. Viel schwieriger ist die Frage, ob ein gegebener Graph 3-färbbar ist. Das Entscheidungsproblem
Graph k-Colorability wird wie folgt definiert:
Graph k-Colorability (Chromatic Number) [GT4]:
Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k.
Frage:
Ist χ(G) ≤ k?
Der Spezialfall k = 3 liefert folgendes Entscheidungsproblem:
Graph 3-Colorability
Gegeben: Ein Graph G = (V, E).
Frage:
Ist χ(G) ≤ 3?
Satz 9.4 Das Problem der 3-Färbbarkeit von Graphen ist NP-vollständig.
Beweis: Das 3-Färbbarkeitsproblem ist offenbar in NP. Nun reduzieren wir 3SAT auf
das 3-Färbbarkeitsproblem wie folgt: Zu gegebener KNF F = C1 ∧. . .∧Cm konstruieren
wir einen Graphen GF , der die Knoten T, F, R hat (die gleichzeitig als Farben T, F, R
bzw. grün, blau, rot aufgefaßt werden), die ein Dreieck bilden. Außerdem hat GF die
Knoten xi , −xi zu jeder Variablen xi , und {xi , −xi } bilden jeweils eine Kante. Die
Knoten xi , −xi werden alle mit dem Knoten R durch eine Kante verbunden.
Schließlich gibt es zu jeder Klausel Cj die Knoten aj , bj , cj , dj , ej , wobei die Knoten
aj , bj , cj ein Dreieck bilden, und {cj , dj } sowie {dj , ej } sind Kanten. Die Knoten dj und
ej werden jeweils durch eine Kante mit dem Knoten T verbunden. Außerdem sind die
Knoten aj , bj , ej die Kontaktknoten zu den Literalknoten der jeweiligen Klausel Cj ,
d.h., aj bekommt eine Kante zum ersten Literalknoten, bj eine Kante zum zweiten und
ej eine Kante zum dritten Literalknoten von Cj . Ein Beispiel ist in Abbildung 3 für
die Formel F = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (¬x1 ∨ x2 ∨ x4 ) gegeben.
Behauptung: F ist genau dann erfüllbar, wenn GF 3-färbbar ist.
42
x1
F
R
-x1
x2
T
a1
d1
-x2
c1
x3
b1
e1
d2
a2
c2
-x3
x4
-x4
b2
e2
Abbildung 3: Der Graph GF für die Formel F = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (¬x1 ∨ x2 ∨ x4 ).
Dabei ist von entscheidender Bedeutung, daß der Teilgraph, der durch die Klauselknoten aj , bj , cj , dj , ej zusammen mit T und den Literalknoten induziert wird, nicht
3-färbbar ist, wenn die Farben der drei Literalknoten alle F sind (da die Literalknoten
alle zu R adjazent sind, kommt bei einer 3-Färbung nur T und F in Frage). In allen
übrigen Fällen gibt es eine 3-Färbung.
Ist F erfüllbar, so bekommt mindestens ein Literalknoten pro Klausel die Farbe T , und
damit ist GF 3-färbbar. Ist umgekehrt GF 3-färbbar, so gibt es in jeder Klausel mindestens einen Literalknoten mit Farbe T , und damit läßt sich eine erfüllende Belegung
für F definieren.
q.e.d.
9.4
9.4.1
Chordale Graphen, Intervallgraphen und perfekte Graphen
Chordale Graphen
In vielen Modellbildungen der Informatik, wie z.B. bei relationalen Datenbankschemata
sowie in der Bioinformatik, kommen sogenannte chordale Graphen vor:
Definition 9.3 Es sei G = (V, E) ungerichteter Graph.
(1) Ein Knoten v ∈ V heißt simplizial, wenn die Menge N(v) seiner Nachbarn eine
43
Clique bilden.
(2) Eine Knotenreihenfolge (v1 , . . . , vn ) heißt perfekte Eliminationsordnung (p.e.o.)
von G, wenn für alle i mit 1 ≤ i ≤ n gilt: vi ist simplizial im Restgraphen
Gi := G[{vi , . . . , , vn }].
(3) G heißt chordal, wenn G eine p.e.o. besitzt.
Offenbar sind Blätter in Bäumen simpliziale Knoten, und Bäume sind chordale Graphen, da jeder Baum eine p.e.o. (in Form einer Abpflückreihenfolge von Blättern)
besitzt. Damit ist der Begriff der chordalen Graphen eine (weitgehende) Verallgemeinerung von Bäumen. Allerdings haben auch chordale Graphen eine Baumstruktur, die
in den erwähnten Modellbildungen eine wichtige Rolle spielt.
Wir zeigen nun zunächst, daß das Problem Graph k-Colorability für chordale Graphen
entlang einer p.e.o. von rechts nach links effizient lösbar ist:
Es sei (v1 , . . . , vn ) eine p.e.o. von G. Es bezeichne ω(G) die maximale Cliquengröße von
G und χ(G) die chromatische Zahl von G. Offenbar ist für beliebige Graphen G die
folgende Ungleichung richtig:
ω(G) ≤ χ(G).
Wir versuchen nun, beim Färben des chordalen Graphen G mit ω(G) Farben auszukommen: Beginnend mit vn werden die Knoten von G von rechts nach links entlang
der p.e.o. gefärbt. Ist man bei vi angekommen, so sind die rechts stehenden Nachbarn
von vi bereits gefärbt. Dies sind höchstens ω(G) − 1 Knoten, da vi in Gi simplizial ist,
also ist noch eine der ω(G) Farben für vi frei. Dieses Argument wiederholt sich, bis
schließlich auch v1 gefärbt ist. Nun gilt für den chordalen Graphen G
ω(G) = χ(G).
Graphen G, für die diese Gleichung für G und alle induzierten Teilgraphen von G gilt,
heißen perfekte Graphen. Chordale Graphen sind also perfekt, aber nicht umgekehrt.
Aufgabe 9.1 Bipartite Graphen sind perfekt, aber dreiecksfreie Graphen nicht.
Aufgabe 9.2
(1) Chordale Graphen mit n Knoten haben höchstens n inklusionsmaximale Cliquen.
(2) Es gibt (nichtchordale) Graphen, die exponentiell viele inklusionsmaximale Cliquen haben.
Aufgabe 9.3 Jeder simpliziale Knoten eines chordalen Graphen kann der erste Knoten einer p.e.o. des Graphen sein.
44
Offenbar ist wegen Aufgabe 9.3 die Frage, ob ein Graph G chordal ist, in Polynomialzeit
lösbar, indem man jeweils so lange wie möglich einen simplizialen Knoten wählt und
ihn als nächsten Knoten in die zu konstruierende p.e.o. einfügt. Wenn dies mit allen
Knoten möglich ist, so erhält man tatsächlich eine p.e.o., andernfalls ist der Graph nicht
chordal. Dies ist kein Linearzeitalgorithmus zur Erkennung von chordalen Graphen, es
gibt jedoch Verbesserungen, die in Linearzeit erkennen, ob ein gegebener Graph chordal
ist, z.B. mit LexBFS.
9.4.2
Intervallgraphen
Es bezeichne [l, r] das abgeschlossene reelle Intervall mit dem linken Rand l und dem
rechten Rand r. Es sei M eine endliche Menge von nichtleeren Intervallen auf der reellen
Achse: M = {Ij = [lj , rj ] | j ∈ {1, . . . , n} mit lj < rj }. Dann läßt sich auf folgende
Weise der Durchschnittsgraph von M definieren:
Definition 9.4
(1) Es sei GM = ({1, . . . , n}, EM ) mit ij ∈ EM , falls Ii ∩ Ij 6= ∅.
(2) Graph G heißt Intervallgraph, falls eine Menge M von Intervallen der reellen
Achse mit GM ∼ G existiert.
Aufgabe 9.4 Zeigen Sie: Intervallgraphen sind chordale Graphen.
Gleichzeitig definiert eine Menge M von Intervallen der reellen Achse auch eine
Intervall-Halbordnung PM = ({1, . . . , n}, <M ) auf {1, . . . , n}:
Definition 9.5 Es sei i <M j, falls Ii = [li , ri ] ganz links von Ij = [lj , rj ] liegt, d.h.
ri < lj . Wir schreiben abkürzend Ii L Ij . Außerdem sei i ≤M j, falls Ii L Ij oder
Ii = Ij .
Dieses Modell kommt in vielen Anwendungen vor, so u.a. in Arbeiten des amerikanischen Biologen Benzer, der für seine Arbeiten über die Feinstruktur der Gene
den Nobelpreis erhielt. Wir wählen hier ein anderes Beispiel. Gegeben sei eine Menge J = {j1 , . . . , jn } von Jobs mit Anfangszeiten {a1 , . . . , an } und Beendigungszeiten
{e1 , . . . , en }, d.h. jeder Job definiert ein Zeitintervall. Jobs, deren Zeitintervalle einen
nichtleeren Durchschnitt haben, können nicht (gleichzeitig) durch denselben Executor
ausgeführt werden. Im übrigen kann jeder Executor jeden Job im Prinzip ausführen.
Gesucht ist eine kleinste Zahl von Executoren, die die Jobs ausführen können. Offensichtlich ist dies gerade das Färbungsproblem des zugehörigen Intervallgraphen, d.h.
die kleinste Zahl von Executoren, mit denen sich die Jobs ausführen lassen, ist gerade
χ(GM ).
Um den Zusammenhang zwischen GM und der Intervallordnung <M näher zu betrachten, geben wir eine weitere Definition an:
45
Definition 9.6 Es sei P = (V, ≤P ) eine Halbordnung auf V und i <P j, falls i ≤P j
und i 6= j. Damit ist GP = (V, EP ) mit ij ∈ EP , falls i <P j oder j <P i der
Vergleichbarkeitsgraph von P .
Offenbar gilt für die obige Intervallmenge M: GM ist der Vergleichbarkeitsgraph von
PM , d.h. ij ∈ EM ⇐⇒ Ii ∩ Ij 6= ∅ ⇐⇒ ¬(Ii L Ij ) ∧ ¬(Ij L Ii ).
Definition 9.7 Ein Graph G = (E, V ) heißt transitiv orientierbar, falls gilt: Es existiert eine Menge von gerichteten Kanten F , deren zugrundeliegende ungerichtete Kantenmenge E ist, mit der Eigenschaft: F ist transitiv.
Offenbar ist G genau dann transitiv orientierbar, wenn G der Vergleichbarkeitsgraph
einer Halbordnung ist. Nun zu einer Charakterisierung der Intervallgraphen:
Satz 9.5 Die folgenden Eigenschaften sind äquivalent:
(1) G ist Intervallgraph.
(2) G enthält keinen induzierten Teilgraphen C4 , und G ist transitiv orientierbar.
(3) Die maximalen Cliquen von G lassen sich linear anordnen, so daß für jeden
Knoten v die Cliquen, in denen v vorkommt, ein Intervall in dieser Anordnung
bilden.
Beweis: (1) =⇒ (2): Ist GM Intervallgraph, so ist GM der Vergleichbarkeitsgraph
der Intervall-Halbordnung PM , also transitiv orientierbar. Angenommen, die Knoten
u, v, x, y induzieren in G in dieser Reihenfolge einen C4 . Dann ist Iu ∩ Ix = ∅ und
Iv ∩ Iy = ∅. O.B.d.A. sei Iu LIx . Wegen Iu ∩ Iv 6= ∅ und Iv ∩ Ix 6= ∅ ist der nichtleere
Abschnitt Z zwischen den Intervallen Iu und Ix in Iv enthalten: Z ⊆ Iv . Wegen Iu ∩Iy 6=
∅ und Ix ∩ Iy 6= ∅ ist aber ebenfalls Z ⊆ Iy , also Iv ∩ Iy 6= ∅ - Widerspruch.
(2) =⇒ (3): Es sei F eine transitive Orientierung von G. Wir wollen zeigen, daß die
maximalen Antiketten A1 , . . . , Ak in G die lineare Anordnungseigenschaft in Bedingung
(3) erfüllen. Dazu folgende Hilfsüberlegung: A1 , . . . , Ak sind in G die maximalen Cliquen. Zwischen maximalen Antiketten Ai und Aj existiert stets eine Kante x → y ∈ F :
Wäre dies nicht so, so wäre sogar Ai ∪ Aj Antikette. Außerdem gilt: Sind a → b und
c → d Kanten zwischen Ai und Aj , so haben beide Kanten entweder die Richtung
von Ai nach Aj oder umgekehrt, d.h. alle Kanten zwischen Ai und Aj haben dieselbe
Richtung. Angenommen, a, d ∈ Ai , b, c ∈ Aj mit (a, b), (c, d) ∈ F .
(Nachfolgende Abbildung 4 zeigt die beiden entgegengesetzten Kanten zwischen Aj
und Ai .)
Dann muß mindestens eines der Paare bd, ac in E liegen, da sonst E einen C4 enthält
(bzw. E einen 2K2 ). O.B.d.A. sei ac ∈ E. Ist a → c ∈ F , so ist wegen der Transitivität
von F auch a → d ∈ F - Widerspruch. Ist c → a ∈ F , so ist auch c → b ∈ F Widerspruch. Also haben alle Kanten zwischen Ai und Aj , i, j ∈ {1, . . . , k}, dieselbe
46
Ai
b
c
Aj
a
d
Abbildung 4: Die beiden Kanten zwischen Aj und Ai
Richtung. Damit bilden A1 , . . . , Ak einen vollständigen dag (ein Turnier) in folgendem
Sinn: Ai → Aj gdw. es existieren x ∈ Ai , y ∈ Aj mit x → y ∈ F . Ist Ai → Aj und
Aj → Ak , so ist auch Ai → Ak erfüllt: Es sei x → y ∈ F mit x ∈ Ai , y ∈ Aj und
u → v ∈ F mit u ∈ Aj , v ∈ Ak . Dann ist im Fall y = u die Behauptung klar.
(Nachfolgende Abbildung 5 zeigt die beiden gleichgerichteten Kanten von Ai nach Aj
bzw. von Aj nach Ak .)
x
Ai
y
u
v
Aj
Ak
Abbildung 5: Die Kanten von Ai nach Aj bzw. von Aj nach Ak
Ist yv ∈ E, so ist y → v ∈ F , und die Behauptung ist erfüllt. Ist xu ∈ E, so ist
x → u ∈ F und die Behauptung erfüllt. Ist nun yv ∈ E und xu ∈ E, so ist xv ∈
/ E, da
sonst E einen C4 enthält. Also ist entweder x → v ∈ F oder v → x ∈ F . Ist x → v ∈ F ,
so ist Ai → Ak . Die Kante v → x ∈ F kann nicht auftreten, da sonst u → x ∈ F ist –
Widerspruch.
Es sei nun x ∈ Ai , x ∈ Ak und x ∈
/ Aj . Da x ∈
/ Aj ist, existiert ein y ∈ Aj mit xy ∈ E.
Aus Ai → Aj folgt x → y ∈ F , aus Aj → Ak folgt y → x ∈ F - Widerspruch.
(3) =⇒ (1): Wir wählen für jeden Knoten x das Intervall Ix der Cliquen (Antiketten
in F ) in denen x vorkommt. Dies ist ein Intervallmodell M für G, so daß G = GM ist.
q.e.d.
Die dritte Bedingung von Satz 9.5 ist die Grundlage für einen LinearzeitErkennungsalgorithmus für Intervallgraphen, der sogenannte PQ-Bäume verwendet
und prüft, ob es eine lineare Anordnung der maximalen Cliquen gemäß (3) von Satz
47
9.5 gibt. Dies läßt sich ebenso für die Knoten-Cliquen-Inzidenzmatrizen von Intervallgraphen ausführen.
In der Bioinformatik spielen die sogenannten unit interval graphs eine besondere Rolle
- dies sind die Durchschnittsgraphen von Intervallen derselben Länge (o.B.d.A. Länge
1). Um diese Graphen zu charakterisieren, brauchen wir noch ein paar Begriffe: Ein
Intervallgraph heißt proper interval graph, wenn er ein Intervallmodell hat, bei dem
keine zwei Intervalle ineinander enthalten sind. Der Graph K1,3 besteht aus vier Knoten
a, b, c, d und den Kanten ab, ac, ad. Dieser Graph heißt auch claw.
Satz 9.6 Es sei G = (V, E) Graph. Die folgenden Eigenschaften sind äquivalent:
(1) G ist unit interval graph.
(2) G ist proper interval graph.
(3) G ist K1,3 -freier Intervallgraph.
(4) Es gibt eine Knotenreihenfolge (v1 , . . . , vn ), in der alle abgeschlossenen Nachbarschaften N[vi ] als Intervall aufeinanderfolgender Knoten vorkommen.
Darüber hinaus gibt es noch eine Reihe weiterer Charakterisierungen dieser Graphen.
48
9.5
Stable Matching
Literatur: [J. Kleinberg, É. Tardos, Algorithm Design, Pearson 2006]
Gegeben ist eine Menge M = {m1 , . . . , mn } von Männern sowie eine Menge W =
{w1 , . . . , wn } von Frauen und für jeden Mann eine Vorzugsreihenfolge (d.h. Permutation) aller Frauen bzw. für jede Frau eine Vorzugsreihenfolge aller Männer. Wir betrachten Paarungen P ⊂ M × W zwischen M und W . Eine Instabilität in P besteht aus
Paaren (m, w) ∈ M × W , (m′ , w ′ ) ∈ M × W , so daß gilt: m bevorzugt w ′ vor w und
w ′ bevorzugt m vor m′ . Eine Paarung P heißt stabil, falls P perfect matching ist und
keine Instabilitäten enthält.
Gesucht:
Eine stabile Paarung.
Beispiel 1. M = {m1 , m2 }, W = {w1 , w2 }, mit den folgenden Vorzugsreihenfolgen:
m1 : w1 > w2 (d.h. m1 bevorzugt w1 vor w2 ), m2 : w1 > w2 , w1 : m1 > m2 , w2 : m1 >
m2 .
Das bedeutet: Beide Männer, m1 und m2 wünschen sich w1 als Partnerin, während beide Frauen, w1 und w2 , sich m1 als Partner wünschen. Die Paarung {(m1 , w1), (m2 , w2 )}
ist stabil (obwohl m2 und w2 nicht ihre Wunschpartner bekommen). Die Paarung
{(m1 , w2), (m2 , w1 )} hingegen ist nicht stabil, weil m1 lieber w1 und w1 lieber m1 hätte.
Beispiel 2. M = {m1 , m2 }, W = {w1 , w2 }, mit den Vorzugsreihenfolgen:
m1 : w1 > w2 , m2 : w2 > w1 , w1 : m2 > m1 , w2 : m1 > m2 .
Beide möglichen Paarungen {(m1 , w1 ), (m2 , w2 )} und {(m1 , w2 ), (m2 , w1)} sind stabil,
wobei die erste für die Männer optimal ist, während die zweite für die Frauen optimal
ist. Dieses Beispiel zeigt auch, daß es mehr als eine stabile Paarung geben kann.
Im folgenden Algorithmus können Männer und Frauen jeweils frei oder verlobt sein.
Spielregeln der Männer-Variante:
• Freie Männer m können einer Frau w den Antrag auf Verlobung stellen. Ist w
frei, so sind (m, w) dann verlobt; w kann den Antrag nicht ablehnen.
• Frauen, die bereits verlobt sind, können einen Antrag eines anderen Mannes m auf
Verlobung ablehnen oder ihre jetzige Verlobung auflösen und eine neue Verlobung
mit m eingehen, d.h.: Ist Frau w zur Zeit mit m′ verlobt, m stellt Antrag auf
Verlobung und w bevorzugt m vor m′ , so löst w die Verlobung mit m′ und verlobt
sich mit m; m′ ist dann wieder frei. Im anderen Fall wird der Antrag von m
abgelehnt, und m bleibt frei.
49
Algorithmus 9.1 (Gale, Shapley)
Eingabe: Wie oben beschrieben.
Ausgabe: Eine stabile Paarung P .
(0) Zu Beginn sind alle m ∈ M und alle w ∈ W frei.
(1) while es gibt einen freien Mann m, der noch nicht jeder Frau
einen Antrag gestellt hat do
begin
(2)
wähle einen solchen Mann m; es sei w die für m beste Frau, der m
noch keinen Antrag gestellt hat;
(3)
if w ist frei then (m, w) sind verlobt;
(4)
else w sei zur Zeit mit m′ verlobt;
(5)
if w bevorzugt m′ vor m then m bleibt frei
(6)
else (m, w) sind nun verlobt, und m′ ist wieder frei.
end
(7) P sei die Menge der nun erreichten Verlobungspaare.
Eigenschaft 9.2
(1) Für jede Frau w ∈ W gilt: Nachdem w das erste Mal einen Antrag erhält, bleibt
w stets verlobt, und die Folge ihrer Partner wird in Bezug auf ihre Vorzugsreihenfolge Mw besser.
(2) Die Folge der Frauen, an die ein freier Mann m einen Antrag richtet, wird in
Bezug auf seine Vorzugsreihenfolge Wm schlechter.
(3) Bezeichnet Pt die Menge der Paare (m, w), so daß m ∈ M am Ende der tten Iteration der while-Schleife einen Antrag an w ∈ W gestellt hat, so gilt:
|Pt+1 | > |Pt |. Also wird die while-Schleife höchstens n2 -mal durchlaufen.
(4) Falls der Mann m ∈ M irgendwann frei ist, so existiert eine Frau w ∈ W , an die
m noch keinen Antrag gestellt hat.
(5) Das Ergebnis P des Algorithmus ist ein perfect matching.
(6) Das Ergebnis P des Algorithmus ist ein stable matching.
50
10
Eulerkreise
Datenstrukturen zur Darstellung des Graphen:
1. Die Adjazenzlistendarstellung des Graphen. A(v) bezeichne die Adjazenzliste von
v.
2. Eine doppelt verkettete Liste P von Kanten, die den Weg P beschreibt. Anfangs
ist P leer.
3. Eine Tabelle TV aller Knoten mit folgendem Inhalt:
a) Eine Marke, ob v schon in P vorkommt. Anfangs sind alle Knoten v mit
,,nicht besucht” markiert.
b) Ein Zeiger Next(v) auf die nächste Kante der Adjazenzliste von v, die noch
nicht von v aus durchlaufen wurde. Anfangs zeigt Next(v) auf die erste
Kante in der Adjazenzliste zu v.
c) Ein Zeiger E(v), der in der Liste P auf eine Kante zeigt, die von v aus
durchlaufen wurde. Anfangs ist E(v) undefiniert.
4. Eine Tabelle TE aller Kanten, die für jede Kante e ihre zwei Endknoten enthält
sowie eine Markierung, ob e schon ,,benutzt” wurde. Anfangs sind alle Kanten
mit ,,unbenutzt” markiert.
5. Eine Knotenliste L, die anfangs leer ist. Jeder irgendwann neu erreichte Knoten
wird in L aufgenommen und erst wieder aus L gestrichen, wenn alle zu ihm
inzidenten Kanten durchlaufen wurden.
L enthält insbesondere nicht nur die im ersten Durchlauf (bei Konstruktion von P
nach Punkt (2) des Algorithmus) aufgenommenen Knoten !
Zunächst beschreiben wir folgende Prozedur, die vom Knoten d ausgehend einen Weg
bestimmt, der sich nicht verlängern läßt.
Prozedur 10.1 W EG(d, P):
(1)
(2)
(3)
(4)
(5)
(6)
v := d; P = ∅;
repeat
if v ,,nicht besucht” then
begin L := L ∪ {v}; markiere v ,,besucht” end;
while (Next(v) nicht letzte Kante in A(v)) and (Next(v) ,,benutzt”) do
begin
Next(v) := nächste Kante in A(v);
if Next(v) ,,unbenutzt” then
51
(7)
(8)
(9)
(10)
(11)
(12)
begin
e := Next(v);
Verlängere P mit e;
if E(v) noch undefiniert then E(v) zeigt auf e in P;
{wird beim Einfügen benötigt};
Markiere in der Kantentabelle TE die Kante e als ,,benutzt”;
Bestimme den anderen Endknoten u von e = uv;
v := u;
end
end
(13) until Next(v) ,,benutzt”;
(Hier ist zu betonen, daß durch die in (10) erfolgte Markierung von e nicht auch Next(v)
die gleiche Markierung hat: die Bedingung in (13) ist erst dann erfüllt, wenn in (4) keine
unbenutzte Kante mehr gefunden wird.)
Algorithmus 10.1 (EULERWEG(G))
Eingabe:
Ein ungerichteter, endlicher, nicht notwendig schlichter Graph
G = (V, E, I), V = {v1 , . . . , vn } mit 2 oder 0 Knoten ungeraden Grads.
(O.B.d.A. sei v1 von ungeradem Grad, falls G Knoten mit ungeradem
Grad enthält.)
Ausgabe: Ein Eulerweg von G.
(1) for all v ∈ V do
begin markiere v ,,nicht besucht”; setze E(v) ,,nicht definiert” end;
for all e ∈ E do markiere e mit ,,unbenutzt”;
v := v1 ; L := ∅;
(2) W EG(v, P);
(3) while L 6= ∅ do
begin {L enthält die in W EG(v, P) besuchten Knoten}
(4)
wähle ein u ∈ L; L := L \ {u};
(5)
P ′ sei neue, anfangs leere, zweifach verkettete Liste von Kanten;
(6)
W EG(u, P ′ ); {der dabei entstehende Weg kann leer sein};
(7)
if P ′ 6= ∅ then füge P ′ in P bei E(u) ein;
end;
52
Herunterladen