4.2 Erreichbarkeit in gerichteten Graphen

Problem 4.2.1 (s-t-Erreichbarkeit)Gegeben ein gerichteter Graph G=(V,E) und zwei Knoten s,tV: gibt es einen Pfad von s nach t?

Falls G ungerichtet ist, dann können wir den Algorithmus für Zusammenhangskomponenten aus dem vorherigen Kapitel laufen lassen und dann überprüfen, ob s und t in der gleichen Zusammenhangskomponente liegen. Für gerichtete Graphen geht das leider nicht mehr. Wir brauchen einen vollständigen Perspektivwechsel.

Definition 4.2.2 Sei G=(V,E) ein gerichteter Graph über der Knotenmenge V={1,,n}. Die Adjazenzmatrix ist die Matrix ANn×n mit

Auv:={1 falls (u,v)E0 sonst.

Erinnern Sie sich: ein Kantenzug in G (auf Englisch walk in G) ist eine Folge u0,u1,,uk mit (ui1,ui)E für alle 1ik. Also eine Folge von Knoten, bei der zwei aufeinanderfolgende Knoten durch eine Kante verbunden sind. Die Länge des Kantenzuges ist k. Ein Kantenzug heißt Pfad, falls die k+1 Knoten u0,,uk alle verschieden sind.

Lemma 4.2.3 Sei G=(V,E) ein gerichteter Graph und A seine Adjazenzmatrix. Mit Ak bezeichnen wir die k-te Potenz von A und mit Auvk den Eintrag von Ak in Zeile u und Spalte v. Dann ist Auvk die Anzahl der Kantenzüge von Länge k mit Startpunkt u und Endpunkt v.

Beweis. Wir beweisen das Lemma per Induktion über k. Für k=0 gilt Ak=I, die (n×n)-Einheitsmatrix. Es gilt Iuv=1 genau dann, wenn u=v, ansonsten ist Iuv=0. Dies ist auch genau die Anzahl der Kantenzüge von Länge 0 von u nach v.

Sei nun k1. Wir schreiben B:=Ak1 und somit Ak=AB. Nach Induktionshypothese ist Buw die Anzahl der Kantenzüge der Länge k1 von v nach w. Für zwei Knoten u und w gilt

Auwk=(AB)uw=vVAuvBvw=vV{1 falls (u,v)E,0 sonst}{Anzahl der Kantenzüge der Länge k1 von v nach w}=vV(u,v)E{Anzahl der Kantenzüge der Länge k1 von v nach w}={Anzahl der Kantenzüge der Länge k von u nach w}

Die letzte Gleichung gilt, weil jeder k-Kantenzug von u nach w die Form u,v,,w hat, wobei (u,v)E gilt und v,,w ein Kantenzug der Länge k1 ist.

Die Idee für unseren parallelen Algorithmus für s-t-Erreichbarkeit ist nun, A1,A2,,An1 irgendwie parallel zu berechnen und dann zu schauen, ob irgendwo Astk=1 gilt; hierbei nutzen wir aus, dass ein s-t-Pfad höchstens Länge n1 haben kann. Als Komplikation ergibt sich noch, dass die Einträge von Ak exponentiell groß werden können: in einem vollständigen Graphen zum Beispiel ist Auvk=(n1)k2(n2)=Θ(nk).

Übungsaufgabe 4.2.1 Die Formel (n1)k2 ist fehlerhaft. Sei Kn der vollständige gerichtete Graph auf V={1,,n} ohne Selbstschleifen, also

Kn=(V,V×V{(v,v) | vV})

Sei A die Adjazenzmatrix von Kn. Finden Sie eine explizite Formel für die Einträge in Ak.

Das Problem hoher ganzer Zahlen in Ak lässt sich leicht umgehen. Wir sind ja nicht an der Zahl der Kantenzüge interessiert, sondern nur daran, ob deren Anzahl 0 oder positiv ist. Wir definieren daher für A,B{0,1}n×n das Matrixprodukt AB als

(1)(AB)uw=vVAuvBvw .

Es gilt nun: (Ak)uv ist 1 genau dann, wenn es einen Kantenzug der Länge k von u nach v gibt. Wir definieren nun G~ als den Graphen G plus einer Selbstschleife an jedem Knoten; die Adjazenzmatrix A von G~ ist genau wie die von G, nur dass auf der Diagonale lauter Einsen stehen. Es gilt nun: Auvk=1 genau dann, wenn es in G einen Kantenzug der Länge höchstens k von u nach v gibt. Und somit lösen wir s-t-Erreichbarkeit, in dem wir schauen, ob

(An)st

gleich 1 ist.

Beobachtung 4.2.4 Sei G ein gerichteter Graph, G~ der Graph G plus eine Selbstschleife an jedem Knoten und A die Adjazenzmatrix von G. Für s,tV gilt: es gibt einen s-t-Pfad in G genau dann, wenn (A(n1))s,t=1 ist. Hierbei ist das in (1) definierte "Boolesche Matrixprodukt".

Ein Boolescher Schaltkreis für s-t-Erreichbarkeit

Unseren parallelen Algorithmus für s-t-Erreichbarkeit beschreiben wir als Booleschen Schaltkreis. Sei d so, dass 2d1<n2d gilt. Wir berechnen A2d statt An, was aber das Gleiche ist. Es gilt d=logn. Wir können nun A2d mit d vielen "-Gates" berechnen:

Dies ist im Prinzip die schnelle Matrixmultiplikation, wie Sie sie vielleicht in Theoretischer Informatik 1 gesehen haben. Wir beschreiben nun einen Schaltkreis für . Dieser ist sehr groß, aber nicht sehr tief:

Dieser Schaltkreis berechnet (AB)uw für ein Paar uw; wir bauen nun n2 solche Schaltkreise parallel für jedes Paar. Um Fan-in 2 zu erreichen, müssen wir das noch durch einen Binärbaum aus ersetzen. Der -Schaltkreis hat somit n2(n+n1)inΘ(n3) Gates. Beachten Sie: das Θ(n3) entspricht der Θ(n3), das Sie für die Laufzeitkomplexität des "üblichen" Matrixmultiplikationsalgorithmus bekommen. Fassen wir zusammen: ein -Schaltkreis hat O(n3) Gates und Tiefe O(logn). Der gesamte Schaltkreis für s-t-Erreichbarkeit hat somit O(n3logn) Gates und Tiefe O(log2n).

Randbemerkung: auf einer Collision CRCW PRAM oder Common CRCW PRAM können wir das in O(logn) implementieren, weil wir das in O(1) auswerten können.