Graphen und Netzwerke Vorlesung, Wintersemester 2004 Johannes Waldmann, HTWK Leipzig 25. Januar 2005 Überblick Motivation • Graphen sind (neben Zahlen und Mengen) ganz grundlegende mathematische Strukturen. • viele Anwendungs-Probleme (der Informatik) lassen sich auf Graphen-Probleme zurückführen, typischerweise sind das Optimierungs-Aufgaben (Ressourcen sind geeignet zu verteilen und auszunutzen): – konfliktfrei Ressourcen zuordnen (färben) – kürzeste (billigste) Wege auf Landkarte finden – maximalen Fluß finden (in Netzwerk mit Kapazitäten) Inhalt • Graphen • Färbungen • Wege (kürzeste, längste) • Flüsse benutzte Hilfsmittel: • mathematische Notation (Mengen, Relationen) • elementare Algorithmen • Komplexitäts-Theorie (Klassen P und NP) Organisation • Vorlesung: montags 17:15–18:45, G126 • Seminar: donnerstags 11:15–12:45 Li110 Leistungsnachweise: • Prüfungszulassung: – kleinere Aufgaben im Seminar – Online-Aufgaben • Prüfung: Klausur Literatur • online: – J. Waldmann: Vorlesung Graphentheorie (Univ. Leipzig, 2003) http://www.imn.htwk-leipzig.de/ ˜waldmann/edu/ancient/ss03/graphen/ • Bücher – Andreas Brandstädt: Graphen und Algorithmen, Teuber, Stuttgart, 1994 http://www.informatik. uni-rostock.de/˜ab/ab.html – Reinhard Diestel: Graphentheorie, Springer, Berlin, 2002, http://www.math.uni-hamburg.de/home/ diestel/books/graph.theory/ • Software: http://www.graphviz.org/ GraphViz, die Dot-Notation http://www.graphviz.org (frei — entwickelt bei AT&T Research) graph { ; ; } Petersen 1 -- 2; 2 -- 3; 3 -- 4; 4 -6 -- 8; 8 -- 10; 10 -- 7; 7 -1 -- 6; 2 -- 7; 3 -- 8; 4 -- dot -Tps petersen.dot | gv neato -Tps petersen.dot | gv twopi -Tps petersen.dot | gv - 5; 9; 9; 5 -- 1 9 -- 6 5 -- 10 Definitionen, Bezeichnungen Graphen M k := {M 0 | M 0 ⊆ M ∧ |M 0| = k}. M beachte Analogie zur Binomialkoeffizienten: k = Bezeichnung: |M | k • Ein Graph G = (V, E) ist ein geordnetes Paar von – Knotenmenge V (vertex set) – und Kantenmenge E (edge set). • Eine Kante ist eine Zweiermenge von Knoten: E ⊆ V 2 Beispiel: G = ({1, 2, 3}, {{1, 2}, {1, 3}, {2, 3}}). Vereinfachte Notation (Kante ohne Mengen-Klammern): G = ({1, 2, 3}, {12, 13, 23}). . . Das o. g. Modell heißt ungerichteter, einfacher Graph. Es gibt Varianten (betrachten wir später): • gerichtete Kanten, • Schlingen, • Mehrfachkanten Beispiel: Automaten-Graphen Beispiele • vollständiger binärer Baum: Σ = {0, 1}, V = Σ≤k , E = {{w, wa} | w ∈ Σ<k , a ∈ Σ}. • Hyperwürfel: V = Σk , E = {xy | dist(x, y) = 1} wobei dist(x, y) = |{i | 0 ≤ i < k : xi 6= yi}| (Anzahl unterschiedlicher Bits) • Petersen-Graph: M M = {1, 2, 3, 4, 5}, V = 2 , E = {xy | x ∩ y = ∅} M V ( beachte: E ⊆ 2 = 22 ) Aufgaben: beweise direkt aus der Definition: • Hyperwürfel enthält keinen ungeraden Ck • Petersen-Graph enthält kein K3 Standard-Bezeichungen • Pfad mit n Knoten (und n − 1 Kanten): Pn • Kreis mit n Knoten (und n Kanten): Cn • Clique (vollständiger Graph) mit n Knoten: Kn • unanbhängiger Graph mit n Knoten: ({1, 2, . . . , n}, ∅) (Bezeichung In nicht allgemein üblich) • Haus, Stier, Fisch, 3-Sonne, . . . Graphen-Operationen • Komplement: G := (V (G), V (G) 2 \ E(G)) • disjunkte Summe: G + H = (V (G) ∪ V (H), E(G) ∪ E(H)), falls V (G) ∩ V (H) = ∅ • Produkt: G ∗ H = (V (G) ∪ V (H), E(G) ∪ E(H) ∪ {xy | x ∈ V (G), y ∈ V (H)}), falls V (G) ∩ V (H) = ∅ Beispiele: • Rad Wn = K1 ∗ Cn, • vollständiger bipartiter Graph Ka,b := Ea ∗ Eb Isomorphien Def: Abbildung h : V (G) → V (H) heißt Isomorphie zwischen Graphen G und H, falls • h ist bijektiv (umkehrbar eindeutig) • ∀x, y ∈ V (G) : xy ∈ E(G) ⇐⇒ h(x)h(y) ∈ E(H) Def: Graph G ist isomorph zu Graph H, Schreibweise G∼ = H, falls Isomorphie h zwischen G und H existiert. Wir schreiben oft = statt ∼ =. Bemerkung: Graph-Isomorphie ist offensichtlich in NP (ein behauptetes h läßt sich schnell testen), aber es ist unklar, ob es in co-NP ist. (gibt es einen einfachen Beweis für Nicht-Isomorphie?) Selbskomplementäre Graphen G heißt selbstkomplementär, falls G ∼ = G. Der folgende Graph auf 4k Knoten ist selbst-komplementär: • V = {a, b, c, d} × {1, 2, . . . , k} • E enthält: – alle Kanten innerhalb {b} × {1, 2, . . . , k} — kurz: (b, ∗) – alle Kanten innerhalb (c, ∗) – alle Kanten (a, ∗) − (b, ∗) − (c, ∗) − (d, ∗) Beweis: die Isomorphie f : G → G ist f : (a, x) 7→ (c, x), (b, x) 7→ (a, x), (c, x) 7→ (d, x), (d, x) 7→ (b, x). Aufgabe: konstruiere (mit Beweis) selbstkomplementäre Graphen mit 4k + 1 Knoten! Aufgaben zum Petersen-Graph Aus Douglas B. West: Introduction to Graph Theory, Prentice Hall, 1996, 2001 Satz: der Petersen-Graph besitzt die folgende Eigenschaft: für alle nicht benachbarten Knoten x, y gilt: die gemeinsame Nachbarschaft von x und y besteht aus genau einem Knoten. Gibt es weitere Graphen mit dieser Eigenschaft, die keine vollständigen Graphen sind? (Ja, Beispiel C5. Größere? — Für Kn ist die Aussage trivial wahr, da es dort gar keine nicht benachbarte x, y gibt.) Zeige: der Petersen-Graph enthält keinen C7. Graphen-Parameter, Färbungen Teilgraphen • Def: G ist Teilgraph von H, Schreibweise G ⊆ H, falls V (G) ⊆ V (H) und E(G) ⊆ E(H) • Def: für Graphen H und Menge M ⊆ V (H) ist H|M der durch M induzierte Teilgraph (M, E(H) ∩ M2 ). • Def: G ist eingebetteter Teilgraph von H, Schreibweise G ⊆I H, falls H|V (G) = G. Einfache Graphen-Parameter Def: Grad eines Knotens ist Anzahl seiner Nachbarn degV (x) = |{y | xy ∈ E(G)}| • Minimalgrad δ(G), Maximalgrad ∆(G) Bemerkung: wenn δ(G) = ∆(G) = k, dann heißt G k-regulär. • Cliquenzahl ω(G) = max{n | Kn ⊆I G} • Unabhängigkeitszahl α(G) = max{n | In ⊆I G} • Taillenweite girth(G) = min{n | n ≥ 3 ∧ Cn ⊆I G} Aufgaben: bestimme diese Parameter für Petersen-Graph, für Folge der Hyperwürfel Knoten-Färbungen verbal: • Eine k-Knoten-Färbung eines Graphen ordnet jedem Knoten genau eine der Farben {1, 2, . . . , k} zu. • Eine k-Färbung heißt konfliktfrei, wenn jede Kante verschiedenfarbige Knoten verbindet. • Die chromatische Zahl χ(G) ist das kleinste k, für das G eine konfliktfreie k-Färbung besitzt. formal: • Farben Fk = {1, 2, . . . , k}, eine k-Färbung c : V (G) → Fk • ∀xy ∈ E : c(x) 6= c(y) • χ(G) = min{k | ∃konfliktfreie k-Färbung c für G} Parameter-Abhängigkeiten wir kennen α, δ, ∆, χ, girth, ω. untersuche • Abhängigkeiten Beispiel: ∀G : ω(G) ≤ ∆(G) + 1 • und Unabhängikeiten Beispiel: ∀n : ∃G : ∆(G) ≥ n ∧ ω(G) = 2 Aufgabe: Finde solche Beispiele, z. B. mit χ, girth. Aufgabe: mit n = |V (G)|, zeige √ 2 n ≤ χ(G) + χ(G) ≤ n + 1. Finde Graphen G, die beweisen, daß die Schranken nicht verbessert werden können. (D. h. für jedes n zwei Beispiele.) Greedy-Algorithmen ein Such-Algorithmus heißt greedy (gierig), falls er in jedem Knoten des Suchbaums die lokal beste Entscheidung trifft und nie ändert. (backtracking ohne back : der Suchbaum ist nur ein Pfad.) Greedy-Algorithmen sind schnell, aber nicht immer optimal. Beispiel: Münzsysteme: benutze zur Herausgabe eines Betrages immer zunächst das größte passende Geldstück. Ist dieser Algorithmus für das Euro-System optimal (d. h. benutzt immer die geringste mögliche Anzahl von Münzen)? Für welches System nicht (Beispiele)? Greedy-Algorithmus zur Graphenfärbung while x M x } (nicht alle Knoten gefärbt) { = irgendein nicht gefärbter Knoten; = Menge der Farben der Nachbarn von x; erhält kleinste Farbe, die nicht in M • Algorithmus findet immer eine zulässige Färbung • verbraucht ≤ ∆(G) + 1 Farben Aufgabe: Finde Beispiele (d. h. Graph mit Knotenreihenfolge), für die der Algorithmus keine optimale Färbung findet. Wie groß kann die Abweichung (= Anzahl der unnötig benutzten Farben) werden? Eine Schranke für die chromatische Zahl Satz: χ(G) ≤ ∆(G) + 1. Beweis: benutze Färbung durch Greedy-Algorithmus. Aufgabe: für welche Graphen gilt Gleichheit? Darstellung von Graphen • laut Definition: Paar aus Menge von Knoten, Menge von Kanten • verschiedene mögliche Repräsentationen: – Inzidenz-Matrix M : V 2 → {0, 1} – Adjazenzlisten: [(x1, [x2, x3]), (x2, [x1, x4]), . . . ] Liste von Paaren aus jeweils einem Knoten und Liste aller seiner Nachbarn Zugriff in Liste über binäre Suche (logarithmische Zusatzkosten) Aufgabe (RTFC): wie werden Graphen intern in GraphViz repräsentiert? Planare Graphen Definitionen Eine Zeichnung eines Graphen G ist eine Zuordnung • p : V (G) → Punkte der Ebene • s : E(G) → Kurvenstücke (Streckenzüge) mit s(xy) verbindet p(x) mit p(y) Ein Graph G heißt planar (plättbar), wenn er eine kreuzungsfreie Zeichnung besitzt. Bemerkung: wenn G eine kreuzungsfreie Zeichnung besitzt, dann sogar eine, bei der die Kurven Strecken sind (“ohne Knicke”) Kreuzungszahl Definition: die Kreuzungszahl (crossing number) von G ist die kleinstmögliche Anzahl von “Kreuzungen” in einer Zeichnung von G. (G planar ⇐⇒ Kreuzungszahl von G ist 0) Aufgaben: Bestimme Kreuzungszahlen von K4, K5, K6, K7, . . . , K3,3, . . . Der Eulersche Polyedersatz planare Graphen kann man statt in die Ebene auch auf eine Kugel zeichnen, dann sind es Polyeder-Netze. Satz (Euler): Für jeden kreuzungsfreie Zeichnung eines zusammenhängenden planaren Graphen gilt: Anzahl der Ecken + Anzahl der Flächen − Anzahl der Kanten = 2. Beweis: duch Induktion nach Anzahl der Flächen. Folgerungen • K5 ist nicht planar • Aufgabe: zeige ähnlich: K3,3, Petersen–Graph sind nicht planar. Hinweis: benutze Taillenweite • Jeder planare Graph enthält wenigstens einen Knoten vom Grad ≤ 5. (also: G planar ⇒ δ(G) ≤ 5) Bemerkung: gibt es G planar, regulär, Grad 5? Färbungen von planaren Graphen • Satz: G planar ⇒ χ(G) ≤ 6. Beweis: δ(G) ≤ 5 • Satz (Heawood, 1890): G planar ⇒ χ(G) ≤ 5. Beweis: benutzt Kempe-Ketten (1879). • Satz (Appel, Haken 1976): G planar ⇒ χ(G) ≤ 4. Beweis: sehr umfangreich, Fallunterscheidung mit Computer-Unterstützung. Wege, Zusammenhang, Bäume Wege Def. ein Weg in einem Graphen G • ist eine Folge von (abwechselnd) Knoten und Kanten [v0, e0, v1, e1, . . . , ek−1, vk ], • so daß für alle 0 ≤ i < k gilt: ei = {vi, vi+1} ∈ E(G) • und [v0, v1, . . . , vk1 ] sind paarweise verschieden sowie [v1, v2, . . . , vk ] sind paarweise verschieden • Die einzige zugelassene Knoten-Wiederholung ist v0 = vk , ein solcher Weg heißt Kreis. • Die Länge des Weges ist k (= die Anzahl der Kanten, nicht Knoten) — Vorsicht: Länge von P4 ist 3. Wege — Aufgaben (aus Bollobas: Modern Graph Theory, Kapitel 1) Beweis oder Gegenbeispiel: für n ≥ 2: • Kn ist kantendisjunkte Vereinigung von Pfaden mit paarweise verschiedener Länge • Kn ist kantendisjunkte Vereinigung von P2, P3, C3, C4, C5, . . . , Cn−1 Zusammenhang, Komponenten Def. Relation ∼G durch x ∼G y ⇐⇒ ∃Weg von x nach y in G. Satz: ∼G ist Äquivalenzrelation. (reflexiv, symmetrisch, transitiv) Def: die Äquivalenzklassen heißen Zusammenhangskomponenten. Def: wenn ∼G nur eine Äquivalenzklasse erzeugt, dann heißt G zusammenhängend. Aufgabe: für jeden Graphen G gilt: G ist zusammenhängend oder G ist zusammenhängend. Mehrfacher Zusammenhang Def: ein Graph G heißt k-fach knoten-zusammenhängend, falls ∀M ⊆ V (G) : |M | < k ⇒ G \ M ist zusammenhängend. Festlegung: Kn+1 ist n-fach knoten-zshgd (aber nicht (n + 1)-fach). Def: ein Graph G heißt k-fach kanten-zusammenhängend, falls ∀M ⊆ E(G) : |M | < k ⇒ G \ M ist zusammenhängend. Es gilt: G 1-fach knoten-zsgh ⇐⇒ G 1-fach kanten-zshg ⇐⇒ G zshg. Bemerkung: für k ≥ 2 sind die Begriffe k-fach knoten-zshg und k-fach kanten-zshg nicht äquivalent. Satz: Wenn G k-fach knoten-zshgd, dann ist G k-fach kanten-zshg. Abstand, Durchmesser, Radius • Abstand von x und y in G: distG(x, y) = min{length(p) | p ist Weg in G von x nach y} • Durchmesser von G: diam(G) = maxx∈V (G) maxy∈V (G) distG(x, y) • Radius von G: rad(G) = minx∈V (G) maxy∈V (G) distG(x, y) Aufgabe: Zeige rad(G) ≤ diam(G) ≤ 2 rad(G) und finde Beispiele dafür, daß die Schranken nicht verbessert werden können. Bäume Botanik Definitionen • Ein Graph ohne Kreis heißt kreisfrei (azyklisch). • Ein kreisfreier Graph heißt Wald. • Ein zusammenhängender Wald heißt Baum. Bemerkung: in der Definition gibt es keine Wurzel. • Ein Knoten mit Grad 1 heißt Blatt. Bäume Satz: die folgenden Bedingungen sind äquivalent: • G ist ein Baum (d. h. kreisfrei und zusammenhängend) • G ist minimal zusammenhängend (∀e ∈ E(G) : G \ e ist nicht zshgd) • G ist maximal kreisfrei (Aufgabe: formuliere exakt) Gradsequenzen Satz: Für alle Folgen von positiven Zahlen [d1, d2, . . . , dn] gilt: • es gibt einen Baum mit Knotengraden d1, d2, . . . • d1 + d2 + . . . + dn = 2n − 2 Aufgabe: konstruktiver Beweis, d. h. Algorithmus, der den Baum konstruiert (. . . nebst Korrektheitsbeweis). Graceful Labelings Definitionen: • Für Graphen G = (V, E): eine Abbildung f : V → {0, 1 . . . , |E|} heißt graceful, wenn {|f (x) − f (y)| : xy ∈ E} = {1, 2, . . . , |E| − 1} • Ein Graph G heißt graceful, wenn er (wenigstens) ein graceful labelling besitzt. Vermutung: jeder Baum ist graceful. . . . ist seit 40 Jahren offen (man glaubt es kaum) Graphen und Spiele: Havannah Havannah = ein Brettspiel für zwei Personen, erfunden ca. 1980 von Christian Freeling. Spieler setzen abwechselnd je einen Stein eigener Farbe auf einen freien Punkt des hexagonalen Spielfeldes. Spielziel: • einen Kreis (geschlossener Weg) mit Inhalt herstellen • oder zwei Ecken verbinden • oder drei Kanten verbinden Offizielle Webseite: http://www.mindsports.net/ Arena/Havannah/Rules.html. Online spielen hier: http://141.57.11.163/havannah/online/ Havannah—Theorie Es geht also um (sichere) Verbindungen. Man wird deswegen Graph-Algorithmen benötigen für • kürzeste Wege • (mehrfacher) Zusammenhang • maximale Flüsse Der Erfinder ist der Meinung, daß man Havannah nicht ” programmieren kann,“ und hat einen Preis von 1000 EUR ausgesetzt für ein Programm, das ihn in den nächsten 7 Jahren auch nur einmal (in einer Serie von 10 Spielen) schlägt. Havannah—Challenge Holt Euch dieses Geld! Beschäftigung mit Havannah ist als Diplomthema möglich (die Arbeit kann dann aber nicht nur aus Programmieren bestehen, sondern soll den Hintergrund in Graphen/Algorithmen darstellen). Hinweis: für Sommersemester 05 ist Oberseminar zu Spieltheorie/Programmierung/Künstliche Intelligenz in Vorbereitung (Prof. Schönherr, Waldmann) Tiefensuche (rekursiv) • Eingabe: ein gerichteter Graph G = (V, E) • Ausgabe: eine Knotenreihenfolge b : V → N for ( Knoten x in V ) { besucht[x] = false; int counter = 0; while ( exists x : not besucht[x] ) { dfs (x dfs (x) { // zu x existiert Weg aus Baumkanten besucht[x] = true; b[x] = ++counter; for ( y in Nachbarn von x ) { if ( not besucht[y] ) { dfs (y); // xy heißt Baum-Kante } } } Tiefensuche (iterativ) dfs (x) { push (NULL, x); // evtl. Vorgänger und Knoten while ( stack nicht leer ) { (x’, x) := pop (); if (not besucht [x]) { besucht[x] = true; b[x] = ++counter; // (x’, x) heißt Baumkante for ( y in Nachbarn von x ) { push (xy); } } } } Tiefensuche (II) Die Baum-Kanten bilden einen gerichteten Wald B auf der Knotenmenge V (G). Die anderen Kanten xy ∈ E(G) heißen • Rückwärtskante, falls y →∗B x • Vorwärtskante, falls x →∗B y • Querkante, sonst. Tiefensuche auf ungerichteten Graphen Satz: Bezüglich eines Tiefensuchbaums auf einem ungerichteten Graphen gibt es keine Querkanten. Kreise finden Def: Ein gerichteter kreisfreier Graph heißt DAG (directed acyclic graph). Satz: Ein gerichteter Graph ist genau dann ein DAG, wenn die Tiefensuche keine Rückwärtskante erzeugt. Implementierung: wie Tiefensuche, mit zusätzlichem Feld verlassen Zweifach zusammenhängende Komponenten Def: x ∈ V (G) ist Artikulationspunkt, falls K(G) > K(G \ v) (wobei K(G) = Anzahl der Zusammenhangskomponenten von G). Def: M ⊆ V (G) ist 2-fache Zusammenhangs-Komponente (Block), falls M maximal 2-fach zusammenhängend ist: 1. G|M ist 2-fach zusammenhängend 2. für jede echte Obermenge M 0 ⊃ M gilt: G|M 0 ist nicht 2-fach zusammenhängend Literatur: Brandstädt: Graphen und Algorithmen Zweifach zusammenhängende Komponenten (II) Bestimmung der Artikulationspunkte durch Tiefensuche. Sei (V, B) ein DFS-Baum für G = (V, E) und t : V → N die dazu gehörende Knotenreihenfolge. Def: L(v) := min{t(u) | v →∗B w →0,1 E\B u} Satz: u ist Artikulationspunkt ⇐⇒ • u ist Wurzel von B und outdegB (u) > 1 • oder u ist nicht Wurzel von B und ∃uv ∈ E : L(v) ≥ t(u). Aufgabe: ist hier L(v) > t(u) möglich? Gerüste (spanning trees) Def: T ist Gerüst von G, falls: • T ist Baum • V (T ) = V (G) T spannt g auf “ ” • E(T ) ⊆ E(G) Shannon Switching Game (erfunden/untersucht von Claude Shannon, auch vermarktet als Bridge-It“) ” • Spielfeld/-situation: ein Graph G mit zwei markierten Punkten N, S, Kanten sind anfangs alle weiß. • Spieler: Cutter (beginnt) und Connector • Spielzüge: – Cutter löscht eine weiße Kante – Connector färbt eine weiße Kante rot • Spielziel: – Connector gewinnt, sobald es einen roten Weg zwischen N und S gibt. – Cutter gewinnt, sobald N und S nicht zusammenhängen. Shannons Heuristik: Widerstandsnetzwerk • N = +5 V, S = 0 V • weiße Kante = 1Ω, rote Kante = 0Ω • wähle immer eine weiße Kante, durch die der meiste Strom fließt. Begründung: viel Strom → Kante ist wichtig (liegt auf vielen Wegen) Lehmanns exakte Lösung benutzt Gerüste von Graphen! Minimale Gerüste MST (minimum spanning tree, Minimalgerüst): • Eingabe: zusammenhängender ungerichteter Graph G, Kantengewichtsfunktion w : E(G) → Q • Ausgabe: eine Gerüst T von G mit minimalem Gewicht w(T ) = Σ{w(e) | e ∈ E(T )}. Anwendungen bei Planung von (Versorgungs-)Netzen: • G sind gewünschte Verbindungen, • T sind die tatsächlich herzustellenden, • w(e) sind die Herstellungskosten (nicht: die Nutzungskosten). MST-Algorithmus von Jarnik, Prim, Dijkstra • zu jedem Zeitpunkt sind Knoten in U ⊆ V schon behandelt (es ist ein MST für U bekannt) • für die Knoten aus V \ U verwaltet man eine geeignete Kostenschätzung. • man fügt einen geeigneten Knoten zu U hinzu (durch eine geeignete Kante zwischen U und V \ U . • das erfordert eine Anpassung der geschätzten Kosten. Vergleiche mit Algorithms von Dijkstra für kürzeste Wege. MST: Prim, Korrektheit beruht auf Lemma: • Wenn U ⊆ V und e0 eine Kante zwischen U und V \ U mit minimalem Gewicht, • dann existiert ein Minimalgerüst T für G mit e0 ∈ E(T ). Beweis: Sei T 0 ein Minimalgerüst für G, das e0 nicht enthält. Konstruiere daraus ein Gerüst T für G mit e0 ∈ E(T ) und w(T ) ≤ w(T 0). MST: Prim: Datenstrukturen Die Kostenschätzungen für V \ U müssen verwaltet werden. Rechenoperationen sind: • initialisieren (alles mit +∞) • Knoten mit geringsten Kosten finden und entfernen • Kosten ändern (hier: verringern) Das ist die Schnittstelle für den abstrakten Datentyp Vorrangwarteschlange (priority queue). Mögliche Implementierungen: • ungeordnete Liste • geordnete Liste • binärer Heap (wie in Heapsort) • Binomialheap → Fibonacci-Heap Binomial-Heaps: Definition Ein Binomial-Baum Bn hat eine Wurzel mit Kindern Bn−1, Bn−2, . . . , B1, B0. Wieviele Knoten hat Bn? Wieviele Knoten hat Bn in Schicht k? Ein Binomial-Heap ist eine Menge von paarweise verschieden großen, heap-geordneten Binomial-Bäumen. (heap-geordnet: in jedem Teilbaum enthält die Wurzel einen minimalen Schlüssel). Wieviele Bäume enthält ein Binomial-Heap für n Schlüssel höchstens? Binomial-Heaps: Operationen • Minimum finden: . . . • Schlüssel verringern: . . . • Minimum löschen: . . . • zwei Binomial-Heaps vereinigen Verbesserung: Fibonacci-Heaps: noch geringere (amortisierte) Kosten Matchings und Faktoren Matchings Def: Für Graph G = (V, E): unabhängige Menge M ⊆ E heißt Matching (Paarung). Def: Knoten x ∈ V heißt gesättigt bzgl. M , falls ∃y ∈ V : xy ∈ M . Def: Matching M von G heißt maximal, falls für jedes Matching M 0 von G gilt: |M | ≥ |M 0|. Def: Matching M von G heißt perfekt, falls es V sättigt. Satz von Berge Def: Weg p heißt M -alternierend, wenn er abwechselnd Kanten aus M und E \ M enthält. Def: alternierender M -Weg heißt erweiternde, falls er zwei nicht gesättigte Knoten verbindet. Satz (Claude Berge): für jedes Matching M in G sind äquivalent: • M ist maximal • es gibt keinen erweiternden M -Weg Satz von Hall Def: Graph G = (V, E) heißt bipartit (paar), falls existieren X, Y mit X ∩ Y = ∅, X ∪ Y = V , E ⊆ X × Y ∪ Y × X. Bezeichnung: G = (X, Y, E). Def: Für S ⊆ V , setze G(S) = {y | ∃x ∈ S, y ∈ V : xy ∈ E}. Satz (Hall): Für bipartite Graphen G = (X, Y, E) sind äquivalent: • G besitzt Matching, das X sättigt • ∀S ⊆ X : |S| ≤ |G(S)| Aufgabe: beweise (durch Beispiele), daß die Voraussetzung G bipartit“ nötig ist. ” Vertex Cover, Domination Def: Menge M ⊆ V heißt Knotenüberdeckung (vertex cover) von G = (V, E), falls ∀xy ∈ E : x ∈ M ∨ y ∈ M . Vorsicht: Es werden Kanten überdeckt (durch Knoten). Nicht verwechseln mit: Def: Menge M ⊆ V heißt dominierende Menge von G, falls M ∪ G(M ) = V . Aufgabe: Finde G, bei denen Größe eines kleinsten vertex cover 6= Größe einer kleinsten dominierenden Menge. Satz von König Satz (König 1931): Für bipartite Graphen stimmen überein: • Größe eines kleinsten vertex cover • Größe eines maximalen Matching Flüsse (siehe A. Brandstädt: Graphen und Algorithmen, Kapitel 6) Definitionen: Netzwerke N = (G, q, s, c) heißt Netzwerk, wenn • G ist gerichteter Graph • q, s ∈ V (G), q 6= s (Quelle, Senke) • c : E(G) → R≥0 Kantengewichte (Kapazitäten) Schreibe • InG(y) := {x | (x → y) ∈ E(G)}, • OutG(x) := {y | (x → y) ∈ E(G)}. Definitionen: Flüsse Für f : E(G) → R≥0 und x ∈ V (G) schreibe P + • f (y) = {f (xy) | x ∈ In(y)}, P − • f (x) = {f (xy) | y ∈ Out(y)}, • f (x) = f +(x) − f −(x). f : E(G) → R≥0 heißt zulässiger Fluß, wenn • ∀e ∈ E(G) : 0 ≤ f (e) ≤ c(e) • ∀x ∈ V (G) \ {q, s} : f (x) = 0. Das Maximalfluß-Problem Def: Gesamtfluß f (N ) := f (s) f : E(G) → R≥0 heißt Maximalfluß, wenn f (N ) = max{f 0(N ) | f 0 ist zulässiger Fluß für N }. Aufgabenstellung: • gegeben N , • gesucht ein Maximalfluß f für N . Schnitte Für S ⊆ V (G), q ∈ S, s ∈ / S, definiere S = V (G) \ S. • (S, S) = E(G) ∩ S × S, • (S, S) = E(G) ∩ S × S, • für Fluß f : P P f (S) = {f (e) | e ∈ (S, S)} − {f (e) | e ∈ (S, S)} Erinnerung: f (N ) war definiert als f (V (G) \ {s}, {s}). Satz (die Größe eines Flusses ist an jedem Schnitt gleich): für jeden Schnitt S von N gilt: f (S) = f (N ) Kapazitäten von Schnitten und Flüssen P für Kapazitäten c: c(S) = {c(e) | e ∈ (S, S)}. Lemma; für jeden Fluß f und jeden Schnitt S gilt: f (N ) ≤ c(S). Folgerung: max{f (N ) | f ist Fluß für N } ≤ min{c(S) | S ist Schnitt für N } Satz (Max-Flow-Min-Cut): Hier gilt Gleichheit. Flußvergrößernde Wege Betrachte Knotenfolgen P = (q = x0, x1, . . . , xn = s), so daß für jedes i: • xixi+1 ∈ E(G) (Vorwärtskante) • oder xi+1xi ∈ E(G) (Rückwärtskante) Für Netzwerk N , Knotenfolge P wie oben, Fluß f : • für Vorwärtskante xy: setze ∆(xy) = c(xy) − f (xy) • für Rückwärtskante xy: setze ∆(xy) = f (xy) Setze ∆(P ) = min{∆(xy) | xy ∈ P }. P heißt vergrößernder Weg, falls ∆(P ) > 0. Def: f |P ist die Funktion e 7→ • wenn e Vorwärtskante in P , dann f (e) + ∆(P ), • wenn e Rückwärtskante in P , dann f (e) − ∆(P ), • wenn e nicht in P , dann f (e). Satz: Wenn f Fluß für N und P vergrößernder Weg, dann ist auch f |P Fluß für N , und f |P (N ) = f (N ) + ∆(P ). Maximalflüsse Satz: die Aussagen sind äquivalent: • f ist Maximalfluß für N • es gibt keinen vergrößernden Weg P für N und f . Beweis: →“ ist klar. Interessant ist ←“. ” ” Betrachte S := Menge aller Knoten x, die von q aus über einen Weg aus nützlichen Vorwärts- und Rückwärtskanten erreichbar sind. (e ist nützlich, wenn ∆f (e) > 0.) Zeige: S definiert Schnitt und dann c(S) = f (N ). Bemerkung: falls man Rückwärtskanten nicht gestattet, gilt der Satz nicht ( →“ ja, aber ←“ nicht) ” ” Algorithmus von Ford und Fulkerson Eingabe: Netzwerk N , Ausgabe: ein Fluß f für N . • f0 = (e 7→ 0). • Solange fi einen vergrößernden Weg P gestattet, setze fi+1 = fi |P . • sonst gibt fi aus Satz: In Netzwerken mit ganzzahligen Kapazitäten ist der maximale Fluß ganzzahlig und wird nach endlich vielen Schritten durch diesen Algorithmus gefunden. Bemerkungen: • Algorithmus terminiert, aber rechnet evtl. lange • für irrationale Kapazitäten ist noch nicht einmal Termination garantiert! Verbesserungen festlegen, welcher vergrößernde Weg benutzt wird! • Edmonds/Karp: mit BFS einen kürzesten suchen • Dinitz: Schichten-Netzwerk benutzen (alle kürzesten gleichzeitig) Komplexität Motivation Wenn man ein (Graphen-)Problem durch einen effizienten Algorithmus lösen kann, dann ist alles gut. Wenn man aber trotz größter Mühe keinen effizienten Algorithmus findet, dann möchte man doch wissen, warum. Dazu braucht man eine sinnvolle Definition für den Begriff schwieriges Problem“sowie zum Vergleichen der ” Schwierigkeit von Problemen. Wenn man dann zeigen kann, daß ein Problem in diesem Sinne schwer ist, hat die Suche nach einem effizienten Algorithmus keinen Zweck. Man kann stattdessen suchen nach effizienten Algorithmen für • Näherungslösungen, • exakte Lösungen für gewisse Teilmengen der möglichen Eingaben. Turingmaschinen betrachten nichtdeterministische Turingmaschinen mit • einem Eingabeband (read only, von links nach rechts) • einem Arbeitsband (read/write, beliebig) eine Teilmenge der Zustandsmenge ist als akzeptierend festgelegt. Eine solche Maschine akzeptiert eine Eingabe, falls es ihrem Berechnunsbaum einen Pfad von der Wurzel (Startkonfiguration) zu einem akzeptierenden Blatt gibt. Die Menge (= Sprache) aller akzeptierten Wörter der Maschine M heißt L(M ) Beschränkte Maschinen Für Funktionen t, s : N → N: Die Maschine M ist t-zeitbeschränkt (bzw. s-platzbeschränkt), falls jede akzeptierende Rechnung für eine Eingabe der Länge n aus höchstens t(n) Schritten besteht (bzw. nie mehr als s(n) Zellen des Arbeitsbandes benutzt). Komplexitätsklassen Für eine Menge von Funktionen T : DTIME(T ) bzw. NTIME(T ) ist die Klasse aller Sprachen L, für die es eine Funktion t ∈ T und eine t-zeitbeschränkte deterministische bzw. nichtdeterministische Maschine M gibt mit, die L akzeptiert. entsprechend DSPACE(s) bzw. NSPACE(s) für Platz-Schranken Beispiele: für Const = Menge der konstanten Funktionen: DSPACE(Const): deterministische Maschinen mit endlichem Speicher = endliche Automaten. Bemerkung: es gilt DSPACE(Const) = NSPACE(Const). Wie heißt dieser Satz im Grundstudium? die Klassen P und NP Für Pol = Menge der Polynome: • P = DTIME(Pol) Sprachen (Probleme) mit effizienten Algorithmen • NP = NTIME(Pol) enthält schwierige Sprachen (Probleme) Es gibt noch schwere Probleme ( oberhalb von NP“) ” Das Programm einer nichtdeterministischen Maschine kann man sich so vorstellen: 1. raten, 2. verifizieren. Für NP-Maschinen enthlten 1. und 2. nur polynomiell viele Schritte. . . für ein vorher feststehendes Polynom (insbesondere darf es nicht von der Eingabe abhängen). Es gilt DTIME(f ) ⊆ NTIME(f ) ⊆ NSPACE(f ) (in f (|w|) Zeit kann auch nur f (|w|) Platz verbraucht werden) Reduktion, Vollständigkeit Für Sprachen A und B: A ≤P B, falls es eine P -berechenbare Funktion f gibt. so daß ∀w : w ∈ A ⇐⇒ f (w) ∈ B. Satz: ≤P ist transitiv und reflexiv. Satz: aus A ≤P B und B ∈ NP folgt A ∈ NP. B heißt NP-vollständig, falls • B ∈ NP und • ∀A ∈ NP : A ≤P B Die Klasse der NP-vollständigen Sprachen heißt NPC. Beispiele für NPC Es gibt NP-vollständige Probleme: • das Wortproblem für NP-Maschinen • SAT (Erfüllbarkeit aussagenlogischer Formeln) • 3SAT (. . . in konjunktiver Normalform mit je 3 Literalen pro Klausel) • Vertex Cover, . . . Beweis: das erste folgt (fast direkt) aus Definition, die anderen durch Reduktionen, denn: Satz: wenn A ∈ NPC und A ≤P B, dann B ∈ NPC. Vertex Cover etc. Def: M ⊆ V ist Knotenüberdeckung für G = (V, E), wenn ∀xy ∈ E : x ∈ M ∨ y ∈ M . Def: VC = {(G, k) | G besitzt Knotenüberdeckung der Größe k} Satz: VC ∈ NPC. Beweis: 1. VC ∈ NP (M raten und verifizieren) 2. 3SAT ≤P VC durch folgende Übersetzungsfunktion f : 3-KNF-Formel → Graph × Zahl • für jede Variable v zwei Knoten v, v 0, durch Kante verbunden • für jede Klausel k drei Knoten k1, k2, k3, auf einem C3, • für jedes positive Vorkommen einer Variablen v in einer Klausul-Position ki eine Kante vki, für jedes negative Vorkommen eine Kante v 0ki. • die Zahl k = Anzahl der Variablen von F +2 Anzahl der Klauseln von F . Behauptung: f ist in P-Zeit berechenbar und für jede Formel F : F ∈ 3SAT ⇐⇒ f (F ) ∈ VC Zu zeigen sind beide Richtungen: • aus erfüllender Belegung F konstruiere Knotenüberdeckung für f (F ) • aus Knotenüberdeckung für f (F ) konstruiere erfüllende Belegung für F . VC für Graphen von Maixmalgrad 3 auch noch NP-vollständig. IS = {(G, k) | G besitzt unabh. Menge der Größe k} CLIQUE = {(G, k) | G besitzt Clique der Größe k} Aufgaben: • VC ≤P IS, VC ≤P CLIQUE • Komplexität dieser Probleme für a) planare Graphen, b) bipartite Graphen, c) Bäume 3-Färbbarkeit 3COL = {G | G besitzt 3-Färbung}. Satz: 3COL ∈ NPC. Beweis: 1. 3COL ∈ NP (Färbung raten und verifizieren) 2. 3SAT ≤P 3COL durch folgende Übersetzung . . . Chordale Graphen (Motivation: schwerer Graphenprobleme sind für eingeschränkte Mengen von Graphen evtl. einfacher) Def: G heißt chordal, falls für kein k ≥ 4 : Ck ist induzierter Teilgraph von G d. h. jeder Kreis (≥ 4) besitzt eine Sehne (= chord) Separatoren Def: Für G = (V, E), a, b ∈ V : SV (G) heißt (a, b)−Separator, falls a, b in verschiedenen Komponenten von G \ S. Satz: G ist chordal ⇐⇒ jeder minimale (a, b)-Separator induziert eine Clique in G. Simpliziale Knoten Def: v ∈ V (G) heißt simplizial, falls die Nachbarn von v in G eine Clique (= Simplex) induzieren. Satz: G chordal ⇒ enthält einen simplizialen Knoten. es gilt sogar: ist G keine Clique, dann enthält G zwei nicht benachbarte simpliziale Knoten. Perfect elimination schemes Def: Anordnung [v1, v2, . . . , vn] von V (G) heißt Abpflück-Ordnung (perfect elimination scheme, PES), falls für alle i: vi ist simplizial in G{vi, . . . , vn}. Satz: G chordal ⇐⇒ G besitzt PES. sogar Satz: solches PES kann mit beliebigem simplizialen Knoten beginnen. Dieses PES definiert auf G eine Baumstruktur, diese kann man algorithmisch ausnutzen. Z. B. kann man ω(G) und χ(G) für chordale G leicht bestimmen (viel leichter als für allgemeine Graphen) Perfektion Satz: G chordal ⇒ χ(G) = ω(G). Def: G heißt perfekt, falls für alle induzierten Teilgraphen H ⊆I G gilt: χ(H) = ω(H) Satz: (weak) perfekt graph theorem (Berge 1960 — Lovasz, 1971) G perfekt ⇐⇒ G perfekt Satz: (strong) perfect graph theorem (— Robertson, Seymour, 2003) G perfekt ⇐⇒ G enthält keinen induzierten C5, C7, C9, . . . , C5, C7, C9, . . .. partielle k-Bäume Def: ein Graph heißt k-Baum, wenn er ein PES [x1, . . . , xn] besitzt, bei dem alle Cliquen die Größe k haben: ∀1 ≤ i < n − k : xi hat genau k Nachbarn in G[xi, xi+1, . . . , xn] (und diese bilden eine Clique). Satz: Bäume sind 1-Bäume. Def: ein Graph G = (V, E) heißt partieller k-Baum, falls es einen k-Baum G0 = (V 0, E 0) gibt mit V = V 0 und E ⊆ E 0. Beispiel: Kreise sind partielle 2-Bäume. Algorithmen für k-Bäume grundsätzliche Idee: • das Eliminationsschema für den k-Baum G0 definiert eine Baumstruktur • benutze teile und herrsche in diesem Baum! Die Kosten für das herrschen sind abhängig von k (eventuell sogar exponentiell) ⇒ besonders nützlich für Graphen mit kleinem k. Baumweite Def: die Baumweite (tree width): tw(G) := min{k | G ist partieller k-Baum} leider . . . TW = {(G, k) | tw(G) ≤ k} ∈ NPC, aber . . . für jedes feste k : TWk = {G | tw(G) ≤ k} ∈ P (sogar Linearzeit, aber mit abenteuerlichen Faktoren) Die Algorithmen zur nachträglichen Feststellung der Baumweite bzw. eines Eliminationsschemas sind unpraktisch . . . aber oft gar nicht nötig: in vielen Anwendungen kann man ein Eliminationsschema schon von vornherein in der Eingabe des Algorithmus voraussetzen, z. B. für Graphen, die durch die Art ihrer Erzeugung (also genetisch) kleine Baumweite haben. Reihen-/Parallel-Graphen (wie Reihen- und Parallelschaltungen in der Elektrotechnik) Def: SP ist Menge von markierte Graphen (s, G, t) mit V 3 s 6= t ∈ V . • wenn G nur die Kante s − t ist, dann (s, G, t) ∈ SP • SP ist die kleinste Menge, die abgeschlossen ist unter den Operationen: – (Reihenschaltung) (s1, G1, t1) · (s2, G2, t2) = (s1, G0, t2) mit G0 = G1 ∪ G2 mit t1 = s2 – (Parallelschaltung) (s1, G1, t1) + (s2, G2, t2) = (s1, G0, t1) mit G0 = G1 ∪ G2 mit s1 = s2 und t1 = t2 Satz: (s, G, t) ∈ SP ⇒ tw(G) ≤ 2. Independent Set für G mit beschr. Baumweite gegeben G mit tw(G) = k und entspr. PES für G0 ⊇ G. v ∈ G angehängt an die k-Clique K. s(τ, K) := maximale Größe einer unabh. Menge in Vorgängern von K ∪τ für τ ⊆ K. man kann alle Zahlen s(τ, K) entlang des PES ausrechnen. (wie geht das, wieviele sind es, wie lange dauert es?) Algorithischer Nutzen der Baumweite Viele NP-vollst. Graphenprobleme sind für Graphen mit beschränkter Baumweite in Polynomialzeit lösbar.