1 DFS-Bäume in ungerichteten Graphen

Ähnliche Dokumente
Algorithmen und Datenstrukturen (WS 2007/08) 63

Graphen: Datenstrukturen und Algorithmen

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

1 topologisches Sortieren

Gliederung. Definition Wichtige Aussagen und Sätze Algorithmen zum Finden von Starken Zusammenhangskomponenten

Datenstrukturen & Algorithmen

WS 2009/10. Diskrete Strukturen

Graphen: Einführung. Vorlesung Mathematische Strukturen. Sommersemester 2011

8 Diskrete Optimierung

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Das Briefträgerproblem

Bäume und Wälder. Bäume und Wälder 1 / 37

4 Greedy-Algorithmen (gierige Algorithmen)

Literatur. Dominating Set (DS) Dominating Sets in Sensornetzen. Problem Minimum Dominating Set (MDS)

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Algorithmen und Datenstrukturen 2

Maximaler Fluß und minimaler Schnitt. Von Sebastian Thurm

Algorithmen und Datenstrukturen 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Anmerkungen zur Übergangsprüfung

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Schwierige Probleme in der Informatik Informationen für die Lehrperson

Erzeugung zufälliger Graphen und Bayes-Netze

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Unterscheidung: Workflowsystem vs. Informationssystem

Seminarvortag zum Thema Virtual Private Network Design im Rahmen des Seminars Network Design an der Universität Paderborn

Statistische Untersuchungen zu endlichen Funktionsgraphen

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Praktikum Planare Graphen

Kürzeste Wege in Graphen. Maurice Duvigneau Otto-von-Guericke Universität Fakultät für Informatik

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Breiten- und Tiefensuche in Graphen

Binäre Bäume Darstellung und Traversierung

Suche in Spielbäumen Spielbäume Minimax Algorithmus Alpha-Beta Suche. Suche in Spielbäumen. KI SS2011: Suche in Spielbäumen 1/20

Eine molekulare Lösung des Hamiltonkreisproblems mit DNA

Kombinatorische Optimierung

Algorithmische Methoden der Netzwerkanalyse

Bäume und Wälder. Bäume und Wälder 1 / 37

Fully dynamic algorithms for the single source shortest path problem.

Algorithmen und Datenstrukturen

Die in den Suchverfahren konstruierten Graphen waren zusammenhängend und enthielten keine Kreise. Also vereinbaren wir:

Periodische Fahrpläne und Kreise in Graphen

EndTermTest PROGALGO WS1516 A

Graphentheorie. Organisatorisches. Organisatorisches. Organisatorisches. Rainer Schrader. 23. Oktober 2007

Guten Morgen und Willkommen zur Saalübung!

Algorithmen und Datenstrukturen Suchbaum

Algorithmentheorie Maximale Flüsse

Zeichnen von Graphen. graph drawing

Definition. Gnutella. Gnutella. Kriterien für P2P-Netzwerke. Gnutella = +

13. Binäre Suchbäume

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Undirected Single-Source Shortest Paths with Positive Integer Weights in Linear Time

w a is die Anzahl der Vorkommen von a in w Beispiel: abba a = 2

Steinerbäume. Seminarausarbeitung Hochschule Aalen Fakultät für Elektronik und Informatik Studiengang Informatik Schwerpunkt Software Engineering

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Methoden der Netzwerkanalyse

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

NP-Vollständigkeit. Krautgartner Martin ( ) Markgraf Waldomir ( ) Rattensberger Martin ( ) Rieder Caroline ( )

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Branch-and-Bound. Wir betrachten allgemein Probleme, deren Suchraum durch Bäume dargestellt werden kann. Innerhalb des Suchraums suchen wir

Wir unterscheiden folgende drei Schritte im Design paralleler Algorithmen:

Systematischer Entwurf von Wellendigitalstrukturen

Kapiteltests zum Leitprogramm Binäre Suchbäume

Datenbankanwendung. Prof. Dr.-Ing. Sebastian Michel TU Kaiserslautern. Wintersemester 2014/15.

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

3 Quellencodierung. 3.1 Einleitung

Teil III: Routing - Inhalt I. Literatur. Geometric Routing. Voraussetzungen. Unit Disk Graph (UDG) Geometric Routing 29

Information Systems Engineering Seminar

Auswahl von Klauseln und Atomen in Prolog

Algorithmen II Vorlesung am

Die k kürzesten Wege in gerichteten Graphen

Vortrag. Suchverfahren der Künstlichen Intelligenz. Sven Schmidt (Technische Informatik)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

Was bisher geschah Wissensrepräsentation und -verarbeitung in Zustandsübergangssystemen Constraint-Systemen Logiken Repräsentation von Mengen

Algorithmen und Datenstrukturen Balancierte Suchbäume

Algorithmen und Datenstrukturen SS09

Programmiertechnik II

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Grundlagen der Programmierung 2. Bäume

Kap. 4.2: Binäre Suchbäume

Aufgabe 3: Übersetzen Sie die folgenden natürlich-sprachlichen Aussagen in die Sprache der

Scheduling und Lineare ProgrammierungNach J. K. Lenstra, D. B. Shmoys und É.

368 4 Algorithmen und Datenstrukturen

2. Lernen von Entscheidungsbäumen

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

Sortierverfahren für Felder (Listen)

Binärbäume. Prof. Dr. E. Ehses,

Vorlesung 3 MINIMALE SPANNBÄUME

Wissensbasierte Systeme

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

Tutoren Simon Andermatt Lukas Beck. Alexis Peter Thomas Ritter

Jenseits der reinen kompetitiven Analyse: Access Graphen

Tutoren Jan Ebbe Pat Mächler Valentino Rugolo Sascha Scherrer. Grundlagen der Programmierung (CS101) - Blatt 8 Theorie [4 Punkte] - Praxis [12 Punkte]

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Property Testing in Graphen mit beschränktem Maximalgrad

Transkript:

Praktikum Algorithmen-Entwurf (Teil 3) 06.11.2006 1 1 DFS-Bäume in ungerichteten Graphen Sei ein ungerichteter, zusammenhängender Graph G = (V, E) gegeben. Sei ferner ein Startknoten s V ausgewählt. Startet man bei s eine Tiefensuche (DFS), so besucht diese DFS alle Knoten von G. Jede Kante e E spielt bei der DFS eine von zwei möglichen Rollen: 1. Über die Kante e wird von einem Knoten v aus ein unbesuchter Nachbar w entdeckt; in diesem Fall nennen wir e eine Baumkante, die als abwärts gerichtet von v nach w aufgefasst wird. 2. Wenn die DFS die Kante e betrachtet, ist der Knoten am anderen Ende bereits besucht worden; in diesem Fall nennen wir e eine Rückwärtskante. Ein Beispiel soll das verdeutlichen: s s s b c b c b e d e d e f c f (a) f (b) d (c) Das Bild zeigt (a) einen ungerichteten Graphen, (b) die Einteilung der Kanten in Baumkanten (durchgezogen) und Rückwärtskanten (gestrichelt) durch eine DFS mit Startknoten s, und (c) eine gewurzelte Darstellung des sich daraus ergebenden DFS-Baumes. 2 Zweifachzusammenhangskomponenten Im folgenden sei G = (V, E) ein ungerichteter, zusammenhängender Graph. Definition 1 (Zusammenhang) Der (Knoten-)Zusammenhang von G ist die minimale Anzahl von Knoten, deren Entfernung G in zwei oder mehr Zusammenhangskomponenten zerfallen lässt.

Praktikum Algorithmen-Entwurf (Teil 3) 06.11.2006 2 Ein Graph mit Zusammenhang mindestens 2 heißt auch zweifachzusammenhängend. Definition 2 (Artikulationsknoten) Ein Knoten a von G heißt Artikulationsknoten, wenn G durch Entfernung von a in zwei oder mehr Zusammenhangskomponenten zerfällt. Offensichtlich ist G genau dann zweifachzusammenhängend, wenn er keinen Artikulationsknoten enthält. Die Zweifachzusammenhangskomponenten (auch Blöcke oder engl. biconnected components) von G sind die maximalen Teilgraphen von G, die zweifachzusammenhängend sind. Der nebenstehende Graph besteht aus drei Blöcken, die durch durchgezogene, gestrichelte und gepunktete Kanten gekennzeichnet sind. Die Artikulationsknoten sind schattiert gezeichnet. Es gilt übrigens: Im Schnitt zweier Blöcke liegt höchstens ein einziger Knoten. Blöcke können also keine Kante gemeinsam haben. Die Knoten, die im Schnitt von Blöcken liegen, sind genau die Artikulationsknoten. Die Blöcke bilden eine Baumstruktur, d.h. die Struktur, die entsteht, wenn man Blöcke mit nicht-leerem Schnitt als benachbart betrachtet, enthält keine Kreise. Der Zusammenhang von Graphen und die Berechnung der Blöcke ist zum Beispiel beim Aufbau ausfallsicherer Kommunikationsnetzwerke interessant. Ein zweifachzusammenhängendes Teilnetzwerk bleibt auch dann zusammenhängend, wenn ein beliebiger Knoten ausfällt. 2.1 Erweiterter DFS-Algorithmus Mittels einer nur geringfügig modifizierten Tiefensuche in G können für jeden Knoten v die folgenden Werte ermittelt werden: pre[v] = Präordernummer (DFS-Nummer) von v, d.h. Nummer, die angibt, als wie vielter Knoten der Knoten v von der DFS besucht wurde (pre[s] = 0). low[v] = minimale Präordernummer pre[w] eines Knotens w, der von v aus über 0 Baumkanten abwärts, evtl. gefolgt von einer einzigen Rückwärtskante, erreicht werden kann. Die Berechnung der low-werte geschieht einfach durch Ausnutzung der folgenden Tatsache: ( low[v] = min {pre[v]} {low[w] w ist Kind von v im DFS-Baum } ) {pre[w] {v, w} ist Rückwärtskante } Genauer wird am Anfang der rekursiven DFS-Funktion für einen Knoten v der Wert pre[v] bestimmt und low[v] mit pre[v] initialisiert; dann werden alle Nachbarkanten

Praktikum Algorithmen-Entwurf (Teil 3) 06.11.2006 3 von v betrachtet: bei einer abwärtsgerichteten Baumkante zu einem Kind w erfolgt ein rekursiver Aufruf und anschließend wird low[v] = min{low[v], low[w]} gesetzt; bei einer Rückwärtskante zu einem Knoten w setzen wir dagegen low[v] = min{low[v], pre[w]}. Nun können wir folgendes Lemma verwenden. Lemma 3 Sei G = (V, E) ein ungerichteter, zusammenhängender Graph und T ein DFS-Baum in G. Ein Knoten a V ist Artikulationsknoten genau dann, wenn entweder (a) a die Wurzel von T ist und 2 Kinder hat, oder (b) a nicht die Wurzel von T ist und es ein Kind b von a mit low[b] pre[a] gibt. Somit lassen sich die Artikulationsknoten in G mittels leicht modifizierter DFS effizient in Zeit O( V + E ) ermitteln. Um die Blöcke selbst mit demselben Zeitaufwand zu bestimmen, kann man so vorgehen: Es wird ein Stack S von Kanten verwaltet, der anfangs leer ist. Wenn eine Baumkante abwärts gefunden wird, so wird sie vor dem rekursiven Aufruf auf S abgelegt; wenn eine Rückwärtskante gefunden wird (von dem unteren Endknoten aus), so wird sie sofort auf dem Stack abgelegt. Immer, wenn ein rekursiver Aufruf für Knoten w zu Knoten v zurückkehrt und low[w] pre[v] gilt, bilden die Kanten oben auf dem Stack bis einschließlich der Kante {v, w} genau die Kanten des nächsten Blockes. 3 DFS-Wälder in gerichteten Graphen Sei ein gerichteter Graph G = (V, E) gegeben. Wenn man bei einem Knoten in G eine Tiefensuche startet, so werden nicht unbedingt alle Knoten des Graphen erreicht, und es muss eine weitere Tiefensuche bei einem unbesuchten Knoten gestartet werden. Deshalb ergibt eine DFS in einem gerichteten Graphen nicht einen einzigen DFS-Baum, sondern i.a. einen DFS-Wald, der aus mehreren Bäumen besteht. Jede gerichtete Kante e = (v, w) E wird untersucht, wenn ihr Startknoten v bearbeitet wird, und spielt bei der DFS genau eine von vier möglichen Rollen: 1. Über die Kante e wird ein unbesuchter Nachbar w entdeckt; in diesem Fall nennen wir e eine Baumkante, die als abwärts gerichtet von v nach w aufgefasst wird. 2. Der Knoten w ist bereits besucht worden und hat eine DFS-Nummer, die größer ist als die DFS-Nummer von v; in diesem Fall nennen wir e eine Vorwärtskante. 3. Der Knoten w ist bereits besucht worden und ist ein Vorfahre (Vater, Großvater, usw.) von v im selben DFS-Baum; in diesem Fall nennen wir e eine Rückwärtskante. 4. Der Knoten w ist bereits besucht worden und ist kein Vorfahre (Vater, Großvater, usw.) von v im selben DFS-Baum; in diesem Fall kann w im selben DFS-Baum oder in einem bereits früher erzeugten DFS-Baum enthalten sein, und wir nennen e eine Querkante. Ein Beispiel soll das verdeutlichen:

Praktikum Algorithmen-Entwurf (Teil 3) 06.11.2006 4 0 5 1 4 6 9 2 3 7 8 10 Das Bild zeigt einen möglichen DFS-Wald, der sich bei der Tiefensuche in einem gerichteten Graphen ergeben kann. Baumkanten sind durchgezogen gezeichnet, Querkanten gestrichelt, Vorwärts- und Rückwärtskanten gepunktet. In den Knoten sind die DFS- Nummern (Präordernummern) angegeben. 4 Starke Zusammenhangskomponenten Sei ein gerichteter Graph G = (V, E) gegeben. Zwei Knoten x und y von G liegen in derselben starken Zusammenhangskomponente, falls es in G einen gerichteten Pfad von x nach y und von y nach x gibt. Dadurch lässt sich die Knotenmenge von G vollständig in starke Zusammenhangskomponenten einteilen (partitionieren). Der obige Beispielgraph besteht zum Beispiel aus den fünf starken Zusammenhangskomponenten {0, 1, 2, 3, 4}, {6, 7, 8}, {10}, {9} und {5}. Wir wollen für einen gegebenen Graphen G = (V, E) in Zeit O( V + E ) die starken Zusammenhangskomponenten berechnen. Dies kann wieder mittels modifizierter Tiefensuche erfolgen. Wir betrachten den DFS-Wald und die Präordernummern, die sich durch Tiefensuche in G ergeben. Für jede starke Zusammenhangskomponente Z V nennen wir denjenigen Knoten in Z mit der kleinsten Präordernummer die Wurzel der starken Zusammenhangskomponente. Es lässt sich zeigen, dass ein Knoten r genau dann die Wurzel einer starken Zusammenhangskomponente ist, wenn es: 1. keine Rückwärtskante von einem Nachfahren (dem Knoten selbst oder einem Kind, Enkel,...) von r im DFS-Wald zu einem echten Vorfahren (Vater, Großvater,...) gibt 2. keine Querkante von r oder einem Nachfahren von r zu einem Knoten w gibt, so dass die Wurzel der starken Zusammenhangskomponente von w ein echter Vorfahre von r ist (der Knoten 4 in obigem Beispiel hat so eine Querkante und ist daher keine Wurzel einer starken Zusammenhangskomponente). Die starken Zusammenhangskomponenten lassen sich dann aus dem DFS-Wald abpflücken, indem man einfach bottom-up vorgeht und an allen Wurzeln den noch daranhängenden Teilbaum aus dem Wald entfernt (im

Praktikum Algorithmen-Entwurf (Teil 3) 06.11.2006 5 Beispiel also nacheinander die Teilbäume, die an den Knoten 0, 6, 10, 9 und 5 hängen). Dies lässt sich alles im Rahmen einer einzigen Tiefensuche erledigen. Wir definieren zusätzlich zur üblichen Präordernummer pre[v] eines Knotens v noch einen Wert lowlink[v] wie folgt: lowlink[v] = minimale Präordernummer pre[w] eines Knotens w, der über 0 Baumkanten abwärts, evtl. gefolgt von einer einzigen Rückwärtskante erreicht werden kann, oder der über 0 Baumkanten abwärts gefolgt von einer einzigen Querkante zu einem Knoten in einer Zusammenhangskomponente, deren Wurzel echter Vorfahre von v ist, erreicht werden kann. Die lowlink-werte können während einer geringfügig modifizierten DFS unter Ausnutzung folgender Gleichung berechnet werden: ( lowlink[v] = min { pre[v] } { lowlink[w] w ist Kind von v im DFS-Wald } { pre[w] (v, w) ist Rückwärtskante } { pre[w] (v, w) ist Querkante und die Wurzel der starken ) Zusammenhangskomponente von w ist Vorfahre von v } Genauer wird am Anfang der rekursiven DFS-Funktion für einen Knoten v der Wert pre[v] bestimmt und lowlink[v] mit pre[v] initialisiert; dann werden alle Nachbarkanten von v betrachtet: bei einer abwärtsgerichteten Baumkante zu einem Kind w erfolgt ein rekursiver Aufruf und anschließend wird lowlink[v] = min{lowlink[v], lowlink[w]} gesetzt. Bei einer Rückwärtskante wird dagegen lowlink[v] = min{lowlink[v], pre[w]} gesetzt. Bei einer Querkante zu einem Knoten w muss entschieden werden, ob die Wurzel der starken Zusammenhangskomponente von w ein Vorfahre von v ist oder nicht; das ist genau dann der Fall, wenn w vom Algorithmus noch nicht einer starken Zusammenhangskomponente zugeordnet ( abgepflückt ) wurde, und in diesem Fall setzen wir wieder lowlink[v] = min{lowlink[v], pre[w]} (ansonsten wird die Querkante ignoriert). Wir verwenden die Tatsache, dass ein Knoten r genau dann Wurzel einer starken Zusammenhangskomponente ist, wenn nach Ausführung der DFS-Funktion für r die Bedingung lowlink[r] = pre[r] gilt. Somit ist es für den Algorithmus leicht, die Wurzeln der starken Zusammenhangskomponenten zu erkennen. Die starken Zusammenhangskomponenten selbst können nebenbei während der Tiefensuche bestimmt werden, wenn man folgendermaßen vorgeht. Es wird ein Stack S von Knoten verwaltet, der anfangs leer ist. Wenn die rekursive DFS-Funktion für einen Knoten v aufgerufen wird, so wird am Anfang der Ausführung der Funktion der Knoten v auf den Stack S gelegt. Wenn am Ende der Ausführung der Funktion für Knoten v die Bedingung lowlink[v] = pre[v] gilt, dann bilden alle Knoten oben auf dem Stack bis einschließlich v die nächste starke Zusammenhangskomponente Z. Alle Knoten in Z müssen als bereits einer starken Zusammenhangskomponente zugeordnet markiert werden, damit Querkanten zu diesen Knoten, die später gefunden werden, bei der Berechnung von lowlink-werten nicht mehr berücksichtigt werden.

Praktikum Algorithmen-Entwurf (Teil 3) 06.11.2006 6 Bemerkung: Man sollte sich bewusst machen, dass es gelungen ist, die Berechnung von Zweifachzusammenhangskomponenten in ungerichteten Graphen und von starken Zusammenhangskomponenten in gerichteten Graphen durch eine nur geringfügig modifizierte Tiefensuche in linearer Zeit O( V + E ) zu erledigen. Auf den ersten Blick hätte man vielleicht vermutet, dass dazu Algorithmen mit erheblich größerem Laufzeitbedarf nötig sind!