Wir beschäftigen uns seit der letzten Vorlesung mit den Flussalgorithmen.
Und wir haben in der letzten Vorlesung so ein bisschen die Grundlagen
gesehen und werden heute die ersten Algorithmen sehen, um Flüsse zu berechnen.
Was wir schon gesehen haben in der letzten Vorlesung,
naja, war zunächst mal die Problemdefinition,
dass wir halt Netzwerke haben mit Staat und Zielknoten und kannten die eine Kapazität haben.
Und unser Ziel ist es,
entlang dieser Kanten möglichst viel Fluss zu pumpen und der Erhaltung der Kapazität,
sodass wir ein Maximum von Fluss von der Quelle S zur Senge Tee transportieren.
Und einen ersten Ansatz, wie man das machen kann,
haben wir gesehen, durch das Suchen nach sogenannten augmentierenden Faden oder Erweiterungsfaden.
Das bedeutet, dass wir in unserem Netzwerk immer einen Pfad suchen,
entlang von Kanten, wo noch eine Restkapazität da ist.
Und wenn wir so einen Pfad finden,
dann können wir entlang dieses Pfades den Fluss anheben.
Das ist das Grundkonzept von einer Reihe von Algorithmen,
genauso vorzugehen. Und dieses Grundkonzept wird auch als Ford Fullkassen-Methode
Die ist hier ganz kurz zusammengefasst. Also wir haben am Anfang
den Fluss null. Also in jeder Kante steht noch null dran.
Und dann haben wir einfach eine Wildschleife, die sucht immer argumentierende Pfade.
Und solange es so einen Pfad gibt, pumpen wir dann
weiteren Fluss über diesen Pfad und erhöhen dann den Gesamtfluss.
Und das machen wir so lange, bis wir keinen Pfad mehr finden.
Das ist das, wie gesagt, das Grundkonzept.
Und hinter diesem Grundkonzept verbergen sich jetzt noch viele Fragen.
Die erste natürlich ist das exakt. Also können wir so
über Vorgehen und den Maximaleinfluss zu finden?
Die zweite Frage dann, wie lange dauert das?
Ja, also welche Laufzeit können wir erwarten bei einem Algorithmus
mit einer solchen Strategie
Und natürlich verbergen sich auch noch viele algorithmische Details hier hinter diesem groben Konzept.
Zum Beispiel, wie finden wir seinen argumentierenden Pfad?
Vielleicht gibt es unterschiedlich gute, argumentierende Pfade.
All das müssen wir heute dann noch sehen. Okay,
die prinzipielle Art und Weise, wie wir die Pfade finden können,
haben wir schon gesehen, indem wir gesagt haben,
naja, wir bilden mal ein neues Netzwerk.
Also wenn wir so ein Flussnetzwerk haben mit Knotenkanten und Kapazitäten und wir haben schon einen Fluss berechnet,
dann können wir ein sogenanntes resituales Netzwerk bilden, indem wir einfach sagen,
für jede Kante merken oder berechnen wir die Restkapazität,
Das ist die Kapazität, die wir vorher hatten,
minus den Fluss, der über diese Kante bereits rübergeht.
Wenn wir das tun,
dann können wir uns auf der anderen Seite auch überlegen,
dass wir in so einem Netzwerk in der entsprechenden Gegenrichtung den Fluss wieder herunternehmen.
Und das wäre für uns vorstellbar oder vergleichbar mit der Tatsache,
dass wir einen Fluss in der Gegenrichtung transportieren.
Wir haben also in dem Flussnetzwerk für zwei Knoten,
U und V, immer unsere Kante.
Und entlang dieser Kante haben wir eine Kapazität,
das kann man
sich so vorstellen
Naja, wie so eine Säule. Da kann ich mir
mal vorstellen, wir können es in die Kante reingucken.
Ja, und in dieser Säule haben wir halt einen gewissen
Fluss erreicht für diese Kante. Ja, das geht da
durch. Und wenn wir jetzt das resituale Netzwerk bilden,
dann haben wir wieder die Kante von U nach V.
Und was wir jetzt machen, ist,
wir definieren hier einfach die Restkapazität. Also das,
was noch übrig ist, was wir noch hier durchpumpen können.
Und das ist natürlich genau Kapazität Minusfluss. Und auf der
anderen Seite können wir den Fluss auch wieder zurücknehmen,
das wäre in die Richtung.
Und hier haben wir natürlich jetzt auch eine Kapazität und das
ist genau der Fluss selber
Weil wir können einfach Fluss reduzieren. Und das wäre genauso,
als wenn in diesem Netzwerk Fluss von U von V nach U zurückfließt.
Okay, so modellieren wir das. Und dann kriegen wir
eben neues Netzwerk. Und jetzt kommt ein entscheidendes Detail,
was einen nicht verwirren sollte. Und zwar unserer Netzwerk hat
keine antiparallelen Kanten. Das war uns wichtig.
Also die haben wir aufgelöst, wenn wir sowas hatten.
Und indem wir einfach einen zusätzlichen Knoten eingefügt haben,
das hat beweistechnische Gründe, dass man das macht.
Im Prinzip könnten diese Algorithmen schon auch mit antiparallelen Kanten umgehen
Wir haben die hier aufgelöst. Das resituale Netzwerk,
was wir hier betrachten, hat sehr wohl antiparallele Kanten.
Es muss sogar antiparallele Kanten haben, denn nur immer,
wenn wir einen Fluss haben, erzeugen wir automatisch die Kante in Gegenrichtung.
Ja, okay, das ist jetzt also ein Netzwerk,
das sagt uns, wie viel wir noch in dem Graphen
pumpen können von einem Knoten zu einem anderen.
Und in dem können wir jetzt natürlich einen Pfad suchen.
Und wenn wir jetzt hier einen Pfad finden,
dann wissen wir, naja, wenn wir Kanten existieren,
dann gibt es scheinbar eine Kapazität,
wie viel wir da noch an Fluss drüber pumpen können.
Und wenn wir dann einen Pfad von der Quelle zur Senke finden,
dann können wir über diesen Pfad den Fluss entsprechend erhöhen.
Gut, dafür haben wir auch ein Beispiel gesehen.
Das schauen wir jetzt nicht nochmal an. Also ich nehme an,
das ist jetzt mal klar. Und ein ganz wichtiger Beweis ist jetzt,
dass wir zeigen, dass wir Flüsse tatsächlich so addieren können,
dass wir sagen können, okay,
wir haben einen Fluss-F und dann haben wir noch einen Fluss-F-Strich in einem resitualen Netzwerk.
Beachten Sie, dass wir hier keinen Pfad haben, sondern einen Fluss im resitualen Netzwerk.
Wir brauchen zwar gleich erstmal nur einen Pfad,
aber wir werden den Beweis gleich führen dafür,
dass wir in diesem resitualen Netzwerk auch wiederum einen Fluss haben.
Und dann können wir zeigen,
dass wenn wir diese beiden Flüsse addieren, das bedeutet nichts weiter,
als dass wir für jede Kante die Flusswerte addieren,
dann erhalten wir einen neuen Fluss.
Das muss also gültig sein, die Flusserhaltung muss gelten,
die Kapazitäten müssen berücksichtigt werden. Und dieser neue Fluss muss
die Eigenschaft haben oder soll die Eigenschaft haben,
dass der Fluss wehrt,
also was jetzt aus der Quelle herausfließt,
entspricht gerade den Flusswert des ursprünglichen Flusses plus den Flusswert des
neuen Flusses F-Strich im resitualen Netzwerk
Eine Besonderheit gibt es jetzt noch beim Adieren. Wir können natürlich
einfach die Werte addieren. Wir haben nur das Problem,
dass ja in den resitualen Netzwerken diese Kanten in Gegenrichtung existieren hier.
Und wenn wir jetzt entscheiden, dass im resitualen Netzwerk über
eine solche Kante Fluss gepumpt wird, dann bedeutet das natürlich,
dass der Fluss über die ursprüngliche Kante reduziert werden muss.
Und deswegen sieht die Formel so aus, wie sie hier steht.
Das heißt, wir nehmen den ursprünglichen Fluss.
Wir addieren das, was im resitualen Netzwerk auch von UNAV,
also in die gleiche Richtung transportiert werden soll.
Wir subtrahieren aber das, was im resitualen Netzwerk Umgekehrte Richtung,
das heißt von V nach U transportiert werden soll.
Und das ergibt den neuen Fluss hier für das Netzwerk.
Okay, gut. Das muss man zeigen,
dass das gültig ist, dass hier also ein korrekter Fluss
rauskommt und dazu gehören eine Reihe von Punkten.
Der erste Punkt ist, wir müssen zeigen,
dass dieser Fluss größer gleich null ist für jede Kante.
Ja, denn das ist eine Bedingung, dass also sowas
nicht kleiner sein darf, auch null als null.
Das ist der erste Teil, den wir beweisen müssen.
Das haben wir in der letzten Vorlesung auch bereits gesehen.
Das erste, was man da feststellt, ist,
dass ein Fluss in Gegenrichtung natürlich kleinergleich
der resitualen Kapazität ist in dieser Gegenrichtung von V
Das muss so sein, weil das ist ja ein gültiger
Fluss im resitualen Netzwerk. Und wir wissen aber auch,
dass die Kapazität im resitualen Netzwerk für so eine Gegenrichtung
so hoch ist, wie der Fluss von UNAV.
Das sieht man hier nochmal. Also das war F-U-V und
hier ist es auch F-U-V. Das heißt, die Kapazität,
die wir hier haben in dieser Richtung,
entspricht gerade den Fluss in der entsprechend anderen Richtung.
Okay, so
Wenn dem so ist, können wir sofort sehen,
dass der addierte Fluss größer gleich null ist. Es ist eigentlich klar,
weil wir haben den ursprünglichen Fluss, wir addieren etwas,
was auch noch in diese Richtung gepumpt wird, dann wird es nur größer.
Und wir subtrahieren was, was in die Gegenrichtung gepumpt wird,
aber das, was in die Gegenrichtung gepumpt wird,
hier ist ja maximal so groß wie der Fluss,
den wir vorher in die Hinrichtung gepumpt haben.
Wenn wir das also wieder subtrahieren, ist das auf alle Fälle
größer, gleich null. Es war der erste Teil,
jetzt müssen wir zeigen, dass der Fluss die Kapazität erhält.
Und auch das ist, wenn man dieses Bild erstmal so
vor Augen hat, relativ offensichtlich, denn was passiert?
Also wir haben den Fluss, den wir vorher hatten,
addieren, den Fluss im residualen Netzwerk in die gleichen Richtungen,
subtrahieren den Fluss im residualen Netzwerk in der Gegenrichtung.
Und ja, wir können einfach, dass nach unten abschätzen,
indem wir diesen zweiten Themen hier weglassen, nach oben abschätzen,
indem wir den zweiten Themen hier weglassen.
Das ist ja, das F-Strich ist ja positiv.
Und wenn wir was subtrahieren, lassen wir es weg, dann wird der Therm größer.
Und dann steht hier nur die Summe der beiden Flüsse für die Kante,
für die Richtung von U nach V. Wir wissen,
dass F-Strich natürlich kleiner ist als die Restkapazität,
die wir hier noch haben.
Das wäre hier ja CF, das ist die Restkapazität.
Und ja, und die Restkapazität, da können wir jetzt einsetzen,
das ist die ursprüngliche Kapazität minus den Fluss.
Ja, und dementsprechend ist das hier kleiner gleich der Kapazität von ONAV.
Okay, das heißt, die Flusswerte liegen zwischen null und der Kapazitätsgrenze,
das ist schon mal gut. Dann müssen wir noch zeigen,
dass die Flusserhaltung gilt für alle Knoten, ja,
müssen sie jetzt jeden Knoten anschauen und zeigen,
dass das, was in den Knoten hereinfließt,
auch wieder herausfließt, außer für die Quelle und die Senke,
für die müssen wir es natürlich nicht zeigen,
für die gilt das ja auch nicht
Und das machen wir wie folgt. Wir berechnen die Summe über alle Knoten,
V und dann von den Flüssen, von U nach V hinein.
Also V ist der zentrale Knoten, den wir jetzt betrachten.
Und wir gucken jetzt irgendwie, fließt dir was in
diesen Knoten herein. Und da wir ja schon wissen,
dass diese Flusswerte hier alle null sind für den Fall,
dass da keine Kante existieren,
können wir einfach über alle Knoten hier addieren.
Weil wenn da keine Kante ist,
dann ist der Wert
eh null
Und dann bilden wir einfach die Summe. Das ist alles
das, was hereinfließt. Und wir wollen jetzt zeigen,
dass das genau dem entspricht, was aus dieser,
aus diesem Knoten auch herausfließt. Das müssen wir zeigen. Gut,
wir setzen wieder die Definition ein für die Summe des Flusses.
Das ist also der Fluss von UNAV plus.
Und jetzt kommt der Augmentierende Fluss in der Richtung von UV.
Und jetzt subtrahieren wir den Augmentierenden Fluss in Gegenrichtung.
So hatten wir das definiert. Und jetzt müssen wir ein bisschen rechnen.
Das Erste, was wir machen, ist, diese Summe aufspalten.
Dann haben wir hier entsprechend den Therm für den alten Fluss.
Hier den Therm von V für den argumentierenden Fluss,
hier die Summe über alles, was zurückfließt.
F- und Erstrich sind ja selber gültige Flüsse.
Das heißt, für die gilt natürlich die Flusserhaltung.
Und dementsprechend können wir hier quasi davon ausgehen,
dass es korrekt ist. Das heißt, das,
was in diesen Knoten V hineinfließt, fließt auch wieder heraus.
Dadurch drehen sich ja eigentlich nur die Kanten um in den Summen.
Und dann können wir das wieder zusammenfassen. Und das ist natürlich
genau der Fluss, der aus dem Knoten oder herausfließt.
Also die Flusserhaltung ergibt sich einfach aus der Tatsache,
dass sowohl für F als auch für F-Strich der Fluss erhaltend ist.
Und wenn ich für den Fluss F sage, das, was reinfließt,
fließt doch wieder raus und wenn ich dann für F-Strich aussage,
das, was reinfließt, wie es wieder raus,
dann gilt das für die Summe natürlich genauso.
Okay, Schlusserhaltung und dann gibt es noch die Frage,
wie hoch ist denn jetzt der Wert des neuen Flusses?
Da haben wir gesagt, wenn wir diese beiden Flüsse addieren,
dann sollte der Wert,
also alles, was aus der Quelle herausfließt,
gerade der Wert des Flusses des ursprünglichen Flusses F sein,
plus der Wert des argumentierenden Flusses F-Strich
Ja. Okay, gut. Wie können wir das zeigen?
Hier ist es ganz sinnvoll, die Knoten mal aufzuteilen.
Wir machen mal aus diesem Knoten hier unseren Startknoten S.
In allen praktischen Anwendungen ist es ja so,
dass eigentlich nur Kanten diesen Knoten S irgendwie verlassen werden.
Das macht ja eigentlich gar keinen Sinn,
Knoten irgendwie in S wieder hereinzustecken, weil, naja,
wenn wir das machen, dann würde der ja irgendwann aus
S heraus und dann wird er irgendwie langfließen und dann hier wieder rein,
dann könnten wir ihn auch löschen.
Also eigentlich müssten wir diese Kanten gar nicht betrachten,
aber streng genommen können die natürlich im Netzwerk vorkommen und wir trennen das also.
Wir sagen dann, okay, es gibt eine Knotenmenge
V in
Das sind die Knoten, die die Eigenschaft haben,
dass sie eine Kante besitzen, die nach S hineinführt.
Also diese hier, das ist jetzt unser V-In.
Und dann gibt es die andere Menge, das sind die,
wo eine Kante existiert, die von S dorthin führt.
Das ist einfach eine Trennung. Und ganz wichtig ist es
, wir haben keine Anti-Parallelen Kanten.
Es ist eine Stelle, wo wir diese Eigenschaft benutzen.
Das heißt, der Schnitt von V-In und V-Out ist entsprechend leer.
Okay, gut. Wir wenden einfach wieder die Definition an.
Also wir haben die Wir betrachten den Betrag,
also den Wert des addierten Flusses. Und wir wissen,
dass es der Fluss, der aus der Quelle herausfließt,
minus der Fluss, der in die Quelle zurückfließt.
Und weil wir wissen, wir haben jetzt unsere Kantenmengen,
V-in und V-out definiert, deswegen können wir entsprechend diese Knotenmenge auch reduzieren und sagen,
naja, das sind ja hier nur die Knoten, die aus den Knoten es herausführen.
Und alle anderen haben Innenwert null. Und hier in der zweiten Summe,
das sind natürlich nur Knoten aus der Menge V-in,
das heißt, die eine Kante haben, die in S hereinführen.
So, für den Fluss können wir jetzt unsere Definition wieder
Ja, also wir nehmen den Fluss von SNAV plus den Augmentierenden
Fluss von SNAV minus den Augmentierenden Fluss in der Gegenrichtung.
Machen wir hier entsprechend genauso. Wir teilen die Summen auf
und ziehen sozusagen den Fluss heraus.
Also wir ziehen sozusagen die F-Therme hier heraus.
Das ist das, was wir eh schon kennen.
Das ist nämlich der Fluss in dem ursprünglichen,
also der Flusswert in dem ursprünglichen Netzwerk.
Und für die hinteren fassen wir jetzt die Therme zusammen.
Wir nehmen also jetzt die Vereinigung und haben dann einen F-Strich
von sV-strich von VS
Hier können wir jetzt wieder die vergrößerte Menge nehmen,
weil wir wissen, es gibt im resitualen Netzwerk keine Kanten,
die also von denen Fluss kommen kann,
die nicht in dieser Menge V-Out, vereinigt V-In ist.
Beachten Sie im resitualen Netzwerk, haben wir Antiparallele Kanten.
Das heißt, hier ist es nicht mehr so,
dass der Schnitt leer sein muss. Okay,
deswegen verallgemeinern wir das wieder,
schreiben hier die gesamte Knotenmenge hin und dann steht hier genau
unsere Definition für den Flusswert von F und den Flusswert
von F-Strich
Auch das ist, hier ist es formal aufgeschrieben.
Da muss man nochmal ein bisschen aufpassen, dass man nicht durcheinander kommt.
Aber wenn man mit dem gesunden Menschenverstand rangibt,
ist es sofort klar, dass das auch so sein muss.
Also in dem Netzwerk gilt Flusserhaltung. Sie haben Einfluss F
, der die Quelle verlässt. Sie haben einen Fluss im
residualen Netzwerk, der die Quelle verlässt.
Und offensichtlich ist es nachher, wenn sie die Sachen agieren,
auch entspricht dann der Flusswert genau der Summe.
Okay, so, bis hierhin ungefähr waren wir dann gekommen in der letzten Vorlesung.
Und jetzt widmen wir uns dem neuen Algorithmus. Wir wollen jetzt
nicht über ganze Flüsse argumentieren, sondern nur über einzelne Pfade erstmal.
Und deswegen definieren wir uns einen argumentierenden Pfad und argumentierender Pfad
ist nichts weiter als ein Pfad, der uns von der Quelle zur Senke führt.
Und für diesen Pfad gilt halt, dass für jede Kante,
die entlang dieses Pfades liegt, der Fluss noch kleiner ist als die Kapazität.
Also wir starten bei S,
wir kommen irgendwann mal bei T an und wir haben jetzt also irgendwie einen langen Pfad,
der uns hier hinführt entlang dieses Pfades haben wir halt Knoten,
VI und dann VI plus 1. Ja,
und entlang dieses ganzen Pfades haben wir eine Restkapazität.
Das heißt, Kapazität minus der Fluss, der bereits in diese Richtung fließt,
ist größer als Null. Was wir da machen ist,
wir definieren für diesen gesamten Pfad hier eine Restkapazität und wir sagen,
okay, der hat eine Kapazität und wir fragen uns,
wie viel können wir entlang dieses Pfades noch pumpen?
Ja, wie viel Fluss können wir noch von S nach Tee transportieren?
Und das ist offensichtlich das Minimum der Rest Kapazität von allen Kanten entlang dieses Pfades. Ja,
also wenn wir hier noch zehn Einheiten drüber pumpen können und
hier acht und hier zwei und dann sieben und so weiter,
dann können wir über den ganzen Pfad natürlich maximal zwei,
also das Minimum über alle, diese Kanten rüberpumpen.
Also das heißt, wir betrachten das Minimum der Restkapazitäten,
VI, VI plus eins, über alle Kanten entlang des Pfades.
So, das ist quasi die Kapazität,
die wir jetzt frei haben und die können wir darüber pumpen.
Okay, so können wir einen Fluss im resitualen Netzwerk definieren
Indem wir einfach sagen, wir nehmen halt diesen Pfad,
über den pumpen wir halt genau diesen Fluss und damit argumentieren wir unseren Fluss.
Also, und dann kommt da ein gültiger Fluss raus und
das steht hier in dem nächsten Lämmer.
Wenn wir also ein Flussnetzwerk haben und auf den gibt es bereits einen Fluss,
dann haben wir ein residuales Netzwerk hier, was wir bilden können,
indem wir halt den Fluss mit den Kapazitäten hier verrechnen.
Und dann suchen wir uns so einen argumentierenden Pfad und darüber
können wir jetzt einen neuen Fluss definieren.
Das ist ein argumentierender Fluss und der sieht einfach so aus,
dass wenn eine Kante von U nach V auf diesem Pfad liegt,
ja, auf dem hier, dann definieren wir den Fluss entlang dieser Kante mit der Restkapazität des Pfades.
Das ist also nicht unbedingt die Restkapazität dieser Kante, sondern die des Pfades.
Wir sagen entlang dieses Pfades können wir halt dieses Minimum dann
auch drüber pumpen und jetzt setzen wir dann entlang all dieser
Kanten diesen Wert entsprechend da ein.
Und alle anderen Kanten kriegen den Wert null.
Das ist offensichtlich mal ein gültiger Fluss und den können wir
jetzt addieren
Okay, warum ist das gültig? Also Kapazitätsbeschränkungen gilt nach
Definition. Also weil das ist ja das Minimum über alle
Restkapazitäten und demnach haben wir auch natürlich die Kapazität erhalten.
Die Flusserhaltung gilt, weil es ein Pfad ist.
Das ist ja ein Pfad. Und bei einem Pfad ist es ja so,
da geht immer eine Kante hinein und eine Kante geht wieder hinaus.
Und wenn wir den gleichen Flusswert haben,
dann haben wir natürlich für jeden Knoten die Situation,
das Eintreten da gleich austretender Fluss ist.
Also Flusserhaltung ist damit gegeben. Und der Wert des Flusses,
den wir hier haben, der entspricht natürlich
genau dieser resitualen Kapazität
Des Pfades. Das heißt, der Betrag von FP ist halt das,
was aus der Quelle herausliest, minus das, was wieder her zurückfließt.
Bei unserem Pfad hier fließt überhaupt nichts zurück.
Das heißt, das ist null. Und was hier rausfließt,
ist natürlich genau diese Restkapazität des Pfades. Okay, so,
was wir jetzt machen können ist, wir nehmen diesen argumentierenden Fluss,
der eigentlich nur aus diesem Pfad besteht und addieren den auf den Fluss,
den wir schon haben.
Und dann kriegen wir einen neuen Fluss und der ist genau um diese Restkapazität höher.
Auch das ist, glaube ich, intuitiv klar,
haben also einen Grafen, wir haben ein Flussnetzwerk,
Dann haben wir den Fluss F. Dann können wir das residuale Netzwerk bilden.
Wir haben einen Augmentierenden Pfad P. Das ist der,
den wir hier noch sehen und entlang dieses WGSP definieren wir jetzt
den Fluss FP, so wie wir gerade gesehen haben.
Einfach nur Restkapazitäten über diesen Pfad. Und wenn wir das
so machen, dann können wir die beiden Flüsse addieren.
Und dann benutzen wir jetzt genau das,
was wir gerade gezeigt haben, nämlich,
dass wir Flüsse addieren können und dann ein gültiger Fluss herauskommt.
Und wir wissen auch schon, um wie viel sich
der Fluss erhöht, nämlich genau um diese Kapazität.
Auch das ist hier wieder einfach nur formal formuliert und intuitiv
eigentlich klar
So, der entscheidende Punkt, der uns jetzt noch fehlt,
ist, wie erkennen wir,
dass wir überhaupt den maximal möglichen Fluss berechnet haben?
Also woher wissen wir, dass wenn wir das jetzt immer
so weitermachen, wir irgendwann einen maximalen Fluss haben?
Und woran erkennen wir, dass wir aufhören können?
Die Ford-Frühkassen-Methode sagt, wir hören dann auf,
wenn wir es keinen argumentierenden Pfad mehr gibt.
Aber ist das dann tatsächlich die Situation, dass wir den
maximalen Fluss auch berechnet haben? Wir müssen noch irgendwie zeigen,
dass das auch wirklich der maximal mögliche Fluss haben.
Vielleicht haben wir uns irgendwie ungeschickt angestellt und den Fluss
hätten wir nur anders leiten müssen,
um einen größeren Wert zu bekommen
Okay, wie kriegen wir raus, dass
ein Fluss maximal ist? Die entscheidende Erkenntnis da ist,
dass wenn wir mal S&T betrachten und uns vorstellen,
dass die beiden in einem riesigen Flussnetzwerk miteinander verbunden sind,
dann wissen wir ja der Flusswert, den wir haben.
Das ist das, was aus S heraus fliegst.
Ja, also so können wir uns das ja vorstellen.
Das ist sozusagen das, was hier über diese Kanten hier fließt.
Das ist unser Flusswert, den wir aktuell haben.
Wir addieren quasi den Fluss über diese Kanten,
die S verlassen
Okay, was könnte ein maximaler Fluss sein?
Also was ein maximaler Fluss wäre, wäre ja zum Beispiel,
wenn wir sagen, also die Kapazität von allen Kanten,
die es verlassen, das wäre maximal.
Mehr geht nicht,
weil wenn wir hier überall den Fluss auf die Kapazität setzen würden,
dann würde das ja bedeuten,
dass die Kanten alle ausgelastet sind und mehr kann es dann nicht verlassen.
Und das wäre dann ja der maximale Fluss.
Was wir hier tun, ist, wir schneiden den Grafen
in zwei Teile. Wir schneiden nämlich die Quelle ab von
dem Rest des Grafen
Und sagen dann, wenn wir das so abschneiden,
wie wir das hier mit dem Halbkreis angedeutet habe,
dann haben wir quasi eine obere Schranke für den Fluss,
weil mehr können wir da nicht rausschieben.
Okay, das können wir jetzt auch für allgemeiner,
weil es sagt eigentlich niemand, warum wir diesen Schnitt an diese Stelle machen.
Wir können im Prinzip an einer x-beliebigen Stelle einen Schnitt einführen in dem Grafen und sagen,
okay, auf der einen Seite, das ist die Bedingung,
auf der einen Seite dieses Schnittes ist die Knotenmenge S,
da muss die Quelle liegen und auf der anderen Seite dieses Schnittes,
da muss der Zielknoten liegen,
Ja. Und wenn wir irgendeinen Schnitt machen,
diese Art, ja, dann können wir gucken,
welche Kanten gibt es denn, die über diesen Schnitt drüberlaufen?
Die gibt es übrigens potenziell auch in beiden Richtungen, ja.
Und können schauen, was können wir denn an Fluss über diesen Schnitt transportieren?
Und das wäre eine obere Schranke dafür, wie viel Fluss
maximal im Netzwerk fließen kann. Das ist genau hier ein Schnitt,
also einfach nur eine Aufteilung der Knotenmenge des Graphen,
in die Menge Großess und Großtee,
mit der einzigen Randbedingung, das groß ist,
muss die Quelle enthalten und Großtee muss den Zielknoten enthalten,
Okay, das ist also ein Schnitt in unserem Flussnetzwerk und für
diesen Fluss definieren wir jetzt einen Fluss und eine Kapazität.
Für den Fluss überlegen wir uns, ja, was fließt
denn über diesen Schnitt? Ja, da können wir überlegen,
okay, hier fließt, haben wir irgendeine Kante,
die geht jetzt von U nach V und U liegt auf
der S-Seite und V liegt auf der T-Seite und hier fließt jetzt irgendeinen Fluss drüber.
Ja, und das können wir natürlich addieren. Jetzt könnte es
natürlich sein, dass es auch so eine Kante gibt,
die führt jetzt in die andere Richtung,
die führt jetzt von Tee wieder nach Essen.
Ja, kann ja sein. Kann ja sein,
dass ein Fluss in diese Richtung fließt. Das müssen wir
natürlich streng genommen wieder subtrahieren. Wenn wir wissen wollen,
was fließt denn von der Menge Essen, die Menge Tee
, müssen wir das wieder subtrahieren. Ja,
das heißt, den Fluss, den wir jetzt definieren,
ist quasi die Summe über alle Kanten,
die von S nach Tee führen und dann der Fluss über diese Kante.
Ja, und wir nehmen einfach wieder alle möglichen paar Kombinationen,
weil wir genau wissen, wenn keine Kante existiert zwischen den beiden Knoten,
ist der Fluss null
Deswegen sagen wir einfach, wir nehmen alle. Und was
wir subtrahieren müssen, ist jetzt die Summe über alle Knotenpaare,
wenn wir den Fluss betrachten, der von V nach U führt.
Also der hier wieder aus der Menge Tee heraus hier zurück.
Das müssen wir subtrahieren. Diesen Fluss,
den nennen wir Netto-Fluss, weil es ist sozusagen der Netto-Betrag,
der irgendwann von S aus nach Tee fließt.
Sowas wie, also brutto wäre sozusagen, wenn wir quasi
die Flüsse in Hin- und Rückrichtung irgendwie addieren oder nur die in einer Richtung getrachten.
Also Netto betrachtet das, was einfach noch übrig bleibt,
wenn wir alles aufaddiert haben,
was in die eine und was in die andere Richtung fließt
Das ist der Netto-Fluss. So, und das Zweite,
was wir noch definieren für diesen Schnitt,
den wir ja eingeführt haben, ist die Kapazität.
Und hier machen wir einen Unterschied. Wenn wir die Kapazität betrachten,
schauen wir nur Kanten an, die von S nach Teeflie laufen.
Also nur die in diese Richtung. Diese Kanten werden bei
der Kapazität nicht berücksichtigt, weil die Kapazität über den Schnitt
soll uns ja eine obere Schranke liefern dafür,
was wir von S nach Tee transportieren können.
Wenn wir ganz viele Kanten haben,
wie viel Kapazität von Tee nach S, dann nützen die uns ja nichts.
Wir müssen ja den Fluss von S
nach Tee kriegen
Deswegen, wer bedefinieren wir die Kapazität des Schnittes,
einfach nur als die Summe, über alle Knotenpaare,
wobei U auf der Seite S liegen muss und V auf der Seite Tee, ja.
Okay, so, das sind die Schnitte und das erste,
was man jetzt mal sieht, ist,
dass der Nettofluss, den wir gerade definiert haben,
also das, wo wir gesagt haben,
das liest ihr über den Fluss,
das entspricht gerade
dem Flusswert
Also, das heißt, wenn F ein Fluss ist,
im Flussnetzwerk und ST einen Schnitt, dann gilt,
dass der Flusswert Betrag von F gleich dem Nettofluss über diesen Schnitt ist.
Wir wissen ja schon, also wir haben ja schon gesehen,
der Nettofluss, also der Flusswert, Betrag von F,
der ist ja definiert als das, was aus der Quelle herausfließt.
Also für diesen Schnitt wissen wir ja, okay,
das ist offensichtlich, das ist offensichtlich genau der Flusswert.
Streng genommen ist der Flusswert ja so definiert, das,
was aus S herausfließt, minus das,
was in S wieder hereinfließt.
Und das ist exakt
die Definition
Unseres Netto-Flusses. Also für diesen Einschnitt ist es klar.
Jetzt ist die Frage, wie kann man das für einen x-beliebigen
Schnitt hier zeigen? Das kann man genauso formal tun,
wie sie das bei den anderen Beweisen vorher gesehen haben.
Und im Kormen können sie das auch nachlesen.
Ich habe in diesem Beweis jetzt hier nicht aufgeschrieben,
weil ich den herzlich unintuitiv finde. Ja,
das ist unheimlich viel gerechnet mit diesen ganzen einzelnen Werten.
Und meiner Meinung nach, oder das ist meiner Meinung nach,
es gibt einen viel einfacheren, zunächst mal intuitiv beschriebenen Beweis.
Ich sage ihnen nachher, wie sie den auch formalisieren
Können. Also intuitiv kann man sich das Ganze leicht vorstellen,
dass das Ganze, dass es korrekt ist.
Und zwar machen wir das wie folgt.
Wir haben wieder unseren Startknoten und wir haben unseren Zielknoten.
Zwischen diesen beiden verläuft unser Schnitt,
wo die eine Seite ist S und die andere ist T.
Wir betrachten jetzt mal eine beliebig kleine Einheit des Flusses.
Das ist jetzt der intuitive Teil,
weil das gibt es jetzt so natürlich nicht.
Also so ein DF,
so ein Infinite Simal,
kleinen Teil
Können das auch Tropfen nennen, wenn sie so wollen.
Also wir betrachten jetzt also einen mini-kleinen Tropfen aus diesem Fluss
und den beobachten wir jetzt, wie er quasi von der Quelle wegfließt.
Der fließt jetzt durch das Netzwerk durch und ja,
der passiert dann diesen Schnitt irgendwie und irgendwann kommt unser Tropfen
an dem Zielpunkt T an.
Das ist die eine Möglichkeit. Der Tropfen hat auch noch
eine andere Möglichkeit, was der auch machen könnte.
Jetzt müsstest ihr ein bisschen größer machen. S und T,
der könnte auch hier losfließen und dann hier irgendwie so lang
und irgendwann zur Quelle zurückfließen.
Das könnte der
auch tun
Ist ja auch möglich, könnte er sein. Wie er
da rein zurückfließt. So, wenn wir diese Pfade anschauen,
wie dieser Tropfen zurücklegt, dann passiert dieser Tropfen potenziell unseren Schnitt.
Und es gibt einen Unterschied zwischen diesem Pfad und diesem Pfad.
Und der liegt daran, dass dieser Pfad,
die den Schnitt eine ungerade Anzahl passieren muss,
da geht es rüber, wenn er einmal rübergeht,
ist er auf der Seite Tee.
Vielleicht geht er wieder zu rüber zur Seite S.
Dann ist er das zweite Mal rübergegangen. Aber wenn er
einen Tee ankommen will, dann muss er danach nochmal rübergehen.
Das heißt, hier haben wir eine ungerade Anzahl von Zeiten
von Malen, wo dieser Pfad den Schnitt passiert.
Ja, während hingegen, wenn unser Tropfen wieder zurückfließt zur Quelle,
dann müssen wir den Schnitt eine gerade Anzahl mal passieren.
Ja, weil beim ersten Mal passieren sind wir auf der Tee-Seite,
beim zweiten Mal auf der S-Seite, dann wieder auf der Tee-Seite und so weiter.
Und wenn wir zurückfließen, dann ist es eine gerade Anzahl. Wenn Sie sich jetzt überlegen,
dass immer dann, wenn Sie,
wenn unser Tropfen von S nach Tee fließt,
Sie die Größe des Tropfens addieren und wenn Sie wieder zurückfließen,
wir haben ja den Nettofluss, Die Größe des Tropfens subtrahieren,
dann haben sie in einem ungeraden Fall in der Summe genau die Größe des Tropfens,
die sie addieren auf den Nettofluss.
In diesem Fall addieren sie die Größe des Tropfens in der einen Richtung,
genauso häufig, wie sie ihn für die Gegenrichtung subtrahieren.
Deswegen kommt da null raus. Okay. Und aus diesem Grunde
entspricht quasi der Nettofluss gerade der Nettofluss über den Schnitt gerade den Gesamtfluss,
weil der Gesamtfluss ist ja nichts weiter als die Menge dieser ganz vielen Infinity-Simal-Kleintropfen,
die irgendwie von S nach Tee fließen
Okay, so, das ist also die Art und Weise,
wie man sich vorstellen kann,
dass diese beiden Dinge identisch sind,
Fluss und der Netto-Fluss über den Schnitt und der Flusswert des Flusses.
Ja, hier steht das nochmal in drei Stichpunkten.
Also wir betrachten eine beliebig kleine Einheit, die es verlässt.
Alle Knoten sind Fluss erhalten, damit endet der Delta F,
unser Tropfen, wahlweise in S oder Tee.
Und der Flusswert ist der Teil des Flusses,
der nicht zuerst zurückfließt
Und jetzt können wir uns überlegen,
wenn unser Tropfen DF in S endet,
dann hat er den Schnitt eine gerade mal durch,
gerade Anzahl durchlaufen und es kommt gerade für den Netto-Fluss null raus.
Und wenn er in Tee endet, war es eine ungerade
Anzahl und es kommt gerade die Größe des Tropfens raus.
So, das ist, wie gesagt, jetzt eine intuitive Beschreibung,
warum diese beiden Dinge identisch sein müssen. Ich kann Ihnen aber sagen,
wie Sie das formalisieren können, um das zu formalisieren,
müssen Sie ja, also das hier gibt es ja nicht.
Aber wenn Sie jetzt sagen, Fluss besteht aus einer endlichen
Menge von argumentierenden Pfaden. Wenn sie das zeigen würden,
dann können sie diese Logik natürlich sofort machen. Dann könnten sie einfach sagen,
ich habe eine Menge von argumentierenden Pfaden und dann berachten sie
die Pfade nacheinander und für jeden Pfad zeigen sie dann genau,
nutzen sie diese Argumentation,
um zu sagen, dass diese Augmentierungsschritt dazu führt,
dass der Fluss erhöht wird oder nicht.
Und dass jeder beliebige Fluss aus einer endlichen Menge von argumentierendem
Faden besteht, das zeigen sie in der Übung.
Und wenn sie das hätten, wenn wir das jetzt schon hätten,
dann könnten wir das auch sofort formalisieren
Okay, und wenn Sie es lieber mal kompliziert wollen,
dann können Sie es auch im Kormen nochmal nachlesen.
Okay, so, was folgt aus dem Ganzen? Ja,
wenn wir schon wissen, dass der Fluss hier dem Nettofluss entspricht,
dann können wir eben eine obere Schranke für den Fluss definieren.
Da steht hier in dem nächsten, in der nächsten Schlussfolgerung,
dass die Schnittkapazität in Werte des Flusses beschränkt,
also der Wert eines Flusses in einem Flussnetzwerk ist kleiner als
die Kapazität eines beliebigen Schnittes in G. Also wenn wir einen beliebigen Schnitt nehmen und wir nehmen einen Fluss,
dann wissen wir,
der Flusswert entspricht dem Nettofluss über diesem Schnitt.
Wir wissen, dass der Netto-Fluss-Fluss über einen Schnitt
immer kleiner sein muss als die Kapazität.
Und deswegen ist der Fluss kleiner, gleich der Kapazität über den Schnitt.
Okay, gut. Also damit haben wir eine obere Schranke für
die Größe des Flusses. Jetzt haben wir eine Möglichkeit,
einen Fluss zu berechnen, indem wir ihn schrittweise vergrößern.
Wir augmentieren immer, wir addieren immer was drauf.
Und wir haben zudem auch eine obere Schranke und wissen,
größer als das wird es nicht.
Jetzt müssen wir nur noch schauen,
dass die beiden Dinge auch zusammenpassen,
dass tatsächlich diese obere Schranke auch
wirklich erreicht werden kann
So, und in dem folgenden Theorien greifen alle diese Dinge
jetzt ineinander und über das können wir zeigen,
dass wir über diesen Augmentierungsmechanismus tatsächlich einen maximalen Schluss berechnen können.
Wir können auch dadurch zeigen,
dass wir da ruhig nicht nur das berechnen können,
wir können damit sogar einen minimalen Schnitt berechnen,
weil diese beiden Dinge ganz eng miteinander verzahnt sind und zusammengehören.
Das ist das Max-Flow-Min-Katheorie, also das besagt eben die Dualität
zwischen dem maximalen Fluss und dem minimalen Schnitt in einem Netzwerk
Wenn also F ein Fluss in einem Flussnetzwerk ist,
dann sind die folgenden drei Aussagen äquivalent.
Erstens, F ist ein maximaler Fluss in unserem Graphen.
Zweite Aussage, das resituale Netzwerk GF enthält keine argumentierenden Pfade.
Es gibt keine Möglichkeit mehr weiteren Fluss von dem einen Punkt
zum anderen zu transportieren. Und die dritte Aussage ist,
es existiert einen Schnitt, ST mit der Eigenschaft,
dass der Flusswert gleich der Kapazität des Schnittes ist
Im Prinzip haben wir das alles schon gezeigt. Wir müssen uns jetzt nur,
das müssen es nur zusammensuchen. Wir haben drei Aussagen und wenn wir zeigen,
dass aus 1, 2 folgt und aus 2,
3 folgt und aus 3 wieder 1 folgt,
dann haben wir gezeigt, dass alle drei Aussagen äquivalent sind.
So, wir müssen als erstes zeigen, aus 1 folgt 2,
das machen wir so rum nicht, das ist ein bisschen umständlich,
aber wenn sie alle sich noch an ein bisschen Logik erinnern,
dann wissen sie, dass wir genauso gut zeigen können,
dass aus nicht 2 nicht 1 folgt.
Das ist das Gleiche. Und nicht 2 bedeutet ja im
resitualen Netzwerk gibt es einen augmentierenden Pfad
Ja, und das daraus folgt, dass der Fluss nicht
maximal ist, ist eigentlich schon selbstverständlich. Also wenn P,
ein argumentierender Pfad in dem resitualen Netzwerk ist,
dann ist der Fluss über diesen resitualen Pfad größer als null und F plus FP ist ein neuer Fluss,
von dem wir wissen, dass er gültig ist,
in dem Grafen G und der hat einen Flusswert F plus Betrag,
also den Flusswert von diesem argumentierenden Pfad.
Und das ist dann größer als der Fluss, den wir vorher hatten.
Und deswegen war der Fluss, den wir vorher hatten, nicht maximal.
Also aus nicht zwei folgt nicht eins oder umgekehrt dann aus eins,
Volk zwei. Das haben wir damit gezeigt. So,
wenn wir keinen Pfad mehr haben, Dann wollen wir zeigen,
dass es einen Schnitt gibt.
Das ist der einzige Schritt, wo man nochmal eine Sekunde nachdenken muss.
Also es gibt jetzt keinen argumentierenden Pfad mehr. Und jetzt
stellt sich natürlich die Frage, wo ist denn dieser Schnitt?
Also der jetzt die Eigenschaft hat, dass der Flusswerk gerade der Kapazität entspricht.
Wir haben also hier die Quelle und hier haben wir unsere Senke.
Ja, den Schnitt kennen wir jetzt ja nicht, ist ja nicht gegeben.
Gegeben ist ja nur das Netzwerk und der Fluss.
Wir wissen aber, es gibt keinen argumentierenden Pfad.
Dann überlegen wir uns doch einfach mal, Welche Knoten
können wir im resitualen Netzwerk von S aus noch erreichen?
Also wir können jetzt hier diesen irgendeinen Knoten V noch erreichen,
wenn hier noch eine Restkapazität ist.
Und von dem können wir wieder weitere Knoten erreichen. Ja,
und so entsteht irgendwie ein Netzwerk von den Knoten,
die wir alle von S im resitualen Netzwerk erreichen können.
Wir wissen, dass wir den Knoten Tee nicht erreichen können,
weil wenn wir den Knoten Tee erreichen könnten, hätten wir ja einen argumentierenden Pfad.
Was wir jetzt also machen ist, wir sagen einfach,
die Menge S sind mal alle Knoten im für die gilt,
dass im resitualen Netzwerk ein Pfad existiert von S nach V.
So, und hier machen wir dann entsprechend den Schnitt
und trennen die beiden Mengen voneinander.
Also die S-Menge sind alle die, die wir noch erreichen können.
Und die im resitualen Netzwerk und die Tee-Menge sind alle die,
die wir nicht mehr erreichen können im resitualen Netzwerk.
Dieser Schnitt ist gültig. Das ist natürlich das Erste,
was man mal sagen muss, weil es keinen argumentierenden Pfad gibt.
Wenn es einen argumentierenden Pfad gebe, dann wäre ja Tee
erreichbar und dann wäre Tee auch in der Menge S.
Und das ist ja nicht erlaubt, weil wir wissen,
der Schnitt muss so sein,
dass die Quelle in der Menge S
ist und der Zielknoten in der Menge Tee
So, das heißt, ST ist ein gültiger Schnitt in dem Grafen,
ja, weil das ein gültiger Schnitt ist, wissen wir,
also wir wissen, dass alle Kanten, die rübergehen,
die hier, also in dem ursprünglichen Graf,
wenn hier eine Kante drüber geht, dann wissen wir,
dass die gesättigt ist, ja,
also eine Kante in dieser Richtung ist gesättigt, das heißt,
hier gilt, dass die Kapazität von UV gleich den Fluss sein muss.
Weil wenn das nicht so wäre,
dann hätte die ja noch eine Restkapazität, ne, also sonst,
und dadurch wird diese Kante gelöscht und ist im resitualen Netzwerk nicht mehr da,
das heißt, alle Kanten, die diesen Schnitt passieren,
für die gilt, sie sind gesättigt, Flussgleichkapazität.
Okay, naja, und da müssen wir nur noch addieren,
weil wenn das so ist, dann wissen wir, dass der Betrag des Flusses,
der entspricht ja dem Nettofluss über diesen, über diesen Schnitt.
Und das ist dann größer gleich der Kapazität. Und wir wissen natürlich,
dass sie der Nettofluss immer kleiner gleich der Kapazität ist und
damit gilt der Fluss hier entspricht gerade, der Flusswert entspricht gerade,
der Kapazität dieses Schnittes von S nach Tee.
Okay, und der dritte Teil des Beweises ist,
es muss ein Schnitt existieren, nee,
das haben wir ja schon gezeigt, es muss ein Schnitt
Es existiert einen Schnitt von S nach Tee mit genau diesem Fluss.
Und dann folgt, dass der Fluss maximal ist.
Ja, warum ist das so? Wir haben gezeigt,
wir wissen schon, dass ein Flusswert immer kleiner gleich der Kapazität eines Schnittes ist.
Denn die Kapazität des Schnittes ist eine obere Schranke für den Flusswert. Okay,
und weil wir hier schon gesehen haben, dass der Fluss,
den wir haben, größer gleich der Kapazität des Schnittes ist,
wissen wir, dass der Wert des Flusses gleich der Kapazität des Schnittes ist.
Größer kann es nicht werden und deswegen ist der Fluss natürlich maximal
Okay, das ist das Max Flowman Kategorie und wir haben mehr oder weniger jetzt,
obwohl wir uns die ganze Zeit mit Flüssen beschäftigt haben,
ein zweites, sehr,
sehr wichtiges Grafproblem quasi in den Griff gekriegt,
nämlich das, das Findens von minimalen Schnitten in Grafen.
Okay, so, jetzt haben wir das Problem durchdrungen,
haben aber immer noch keinen Algorithmus.
Das heißt, eigentlich haben wir schon einen,
wir haben ja die Ford Fulkasen-Methode und wir haben jetzt quasi gezeigt,
die ist korrekt.
Das heißt,
dieser Algorithmus liefert einen maximalen Fluss
Steht sie nochmal. Also wir starten mit einem leeren Fluss.
Also die Flusswerte sind alle null. Wir suchen einen argumentierenden Pfad.
Wir erweitern den Fluss über diesen Pfad, bis dieser gesättigt ist.
Das war dieses, dass wir uns das Minimum angucken,
über alle Restkapazitäten entlang der Kante.
Dann gehen wir wieder zurück zu zwei und argumentieren wieder.
Und die Korrektheit folgt direkt aus dem Max Flow mit Kategorien.
Hier ist das nochmal als Psäuso-Code aufgeschrieben,
also am Anfang alle Werte null, solange es dann existierenden Pfad gibt,
bestimmen wir die resituale Kapazität, entlang dieses Pfades.
Und jetzt geben wir, jetzt kommt der Argumentierungsschritt,
wir gucken uns jetzt diese Kanten an, entlang des Pfades.
Und wenn die Kante in der gleichen Richtung in dem ursprünglichen
Grafen vorkommt, dann addieren wir die Kapazität.
Und wenn die Kante in umgekehrter Richtung vorkommt, dann subtrahieren wir die Kapazität.
Ja? Das hier hat wieder damit zu tun,
dass im residualen Netzwerk für potenziell eine Kante in Gegenrichtung nutzen und damit eigentlich meinen,
dass wir den Fluss in dieser Richtung wieder in der originellen Originalrichtung wieder senken.
Okay, das ist die Ford Fulkason-Methode. Funktioniert,
also ist korrekt, da stellt sich jetzt nur die Frage
nach der Laufzeit.
Wie lange wird das dauern
Die Einzelschritte sind relativ leicht abzuschätzen. Also hier so ein
Pfad zu finden, irgendeinen Pfad in einem Netzwerk finden,
der uns zwischen zwei Knoten führt.
Das wissen sie alle. Können wir irgendwie Tiefensuche oder Breitensuche
, finden sie Pfade. Können sie in Lindearzeit machen.
Das ist also kein Ding. Das geht in den Jahrzeit.
Dieser Schritt hier, ja, der Vater hat maximal V-viele Knoten.
Also das heißt, das geht in O von V-Zeit hier.
Und dann müssen sie es argumentieren, da brauchen sie auch von E-Zeit.
Das ist alles unnkritisch. Die Frage ist nur,
wie viele Durchläufe macht diese Wild-Schleife hier?
Wie häufig muss sie
irgendetwas argumentieren
Na? Ja, da denkt man jetzt mal
ein bisschen drüber nach und dann stellt man fest,
da gibt es ja einen blöden Fall.
Und zwar zeige ich Ihnen mal die, oh,
da ist noch ein anderes Beispiel.
Ich zeige Ihnen noch nicht den blöden Fall.
Ich sage Ihnen erst noch ein Beispiel,
aber wahrscheinlich brauchen Sie das fast nicht mehr.
Also hier haben wir unser Netzwerk. Das ist ein
eingescanntes Bild aus einer älteren Version des Kommen.
Deswegen haben Sie hier noch ein anti-Paralleles Kantenpaar.
Das ist erst in der 2009er Version rausgekommen
Nicht ausgetauscht. Also das können Sie jetzt mal irgendwie kreativ ignorieren.
Also hier gibt es irgendwie noch ein Anti-Paralleliskanten-Paar. Okay,
egal, spielt hier keine Rolle. Also wir finden hier
einen Pfad, zum Beispiel diesen hier. Wir bestimmen die Restkapazität,
das wäre hier vier, das Minimum, diese hier,
dann pumpen wir entsprechend vier Flusseinheiten über diesen Pfad.
Und dann haben wir dieses Netzwerk, dieses Flussnetzwerk,
wir können das Rest resituale Netzwerk bestimmen, das sehen Sie in diesem Bild.
Hier können wir wieder einen Pfad suchen,
da finden wir zum Beispiel diesen Pfad,
entlang diesem Pfad, das wäre die Restkapazität sieben,
weil es das Minimum ist
Pumpen, also weitere sieben Einheiten über diesem Pfad, erhalten dann dieses Flussnetzwerk.
Das ist das resituale Netzwerk. Jetzt können wir wieder einen Pfad suchen,
da würden wir zum Beispiel den finden. Da sehen wir,
wir hätten hier acht Einheiten, die wir drüber pumpen können.
Und dann erhöhen wir den Fluss wieder um die acht Einheiten und erhalten dann,
das ist hier nochmal, dann sehen wir hier das Flussnetzwerk.
Hier können wir wieder im Pfad suchen,
hier finden wir zum Beispiel den, im resitualen Netzwerk,
hier können wir nochmal vier Einheiten drüber pumpen,
erhalten wir dieses Netzwerk hier und wenn wir Dieses Netzwerk betrachten und uns mal anschauen,
welche kannten alle gesättigt sind, dann sehen wir,
dann enthalten wir dieses resituale Netzwerk.
Und jetzt können wir von diesem Startknoten S mal gucken,
wo wir noch hinkommen. Und dann sehen wir,
wir kommen noch zu V1. Wir kommen auch noch zu V2
über diese Kante oder über diesen Pfad.
Wir kommen auch noch zu V4. Wir kommen aber nicht mehr
zu V3 und wir kommen auch nicht mehr zu Tee.
Alle kannten im resitualen Netzwerk verlaufen quasi in der Richtung von Tee nach S.
Das heißt, hier sehen Sie unseren Schnitt,
der die Quelle von der Senke trennt.
Und es gibt keinen argumentierenden Pfad mehr der Fluss,
den sie hier berechnet haben, der ist maximal.
Hätte jetzt in diesem Fall also den Wert von 17. Stimmt das?
Nee, nee, 7, 20. Nee,
23. 23 Einheiten gehen hier vors der Quelle raus.
Okay, gut. Ja, das war nochmal das Beispiel,
aber ich glaube, das ist jetzt auch klar.
So, Laufzeitanalyse habe ich gerade schon gesagt. Wir müssen so einen Pfad suchen,
O von E, also so Breiten- oder Tiefensuche,
wäre V plus E, aber wir wissen,
der Grafis zusammenhängt,
alles andere können wir eh ignorieren,
also ist die Kantenmenge größer als die Knotenmenge
Von E, dann müssen wir Restkapazitäten bestimmen und argumentieren.
Das kostet O von E-Zeit. Wir müssen also jede Kante einmal betrachten,
denn der Pfad ist einfach. Ja, wir brauchen keine,
wir sind nicht interessiert an Pfade, die irgendwelche Schleifen machen.
Aber die Frage ist, wie viele Iterationen der Wild-Schleife
gibt es? Wir überlegen uns mal einen Sonderfall.
Wir gehen mal davon aus, die Kantenkapazitäten wären ganz zahlig.
Ja, überlegen, machen wir mal so.
Angenommen, die wären alle ganz zahlig. So,
wir vermuten mal, wir gehen mal davon aus,
wir kennen den Maximeinfluss,
das ist F-Stern.
Jetzt können wir uns überlegen, dass mit Jäger Augmentierung
wird ja der Fluss um die minimale Restkapazität erhöht.
Und wenn die alle ganz zahlig sind, ist diese Restkapazität
mindestens eins. Ja, wenn die mindestens eins ist,
dann wissen wir, es sind höchstens Betrag von F-Stern,
also also der Wert des maximalen Flusses, viele Augmentierungen.
Damit hätten wir eine Laufzeitschranke. Also zumindest für den Fall,
dass es ganz zahlig ist, wissen wir,
also die Laufzeit der Ford-Full-Kassen-Methode wäre O von Betrag von
E mal F-Stern
Ja, also der Wert des maximalen Flusses. Ist das gut oder schlecht?
Ist das eine gute oder eine schlechte Laufzeitschranke? Tja,
also wir beschreiben die Laufzeit jetzt in einer relativ ungewöhnlichen Art
und Weise, weil F. Stern hat zwei Eigenschaften.
Erstens, es ist eigentlich nicht Teil der Eingabe.
Deswegen ist es so ein bisschen komisch. Und zweitens hat F. Stern
auch nicht so viel zu tun mit der Größe der Eingabe.
Ja, F. Stern ist ja der Werte,
der da rauskommt
Im besten Fall könnte sie noch sagen, ja,
wenn ich die Eingabe irgendwie kodieren muss,
dann muss ich ja die Kapazitäten kodieren und F-Stern ist natürlich
irgendwie kleiner als die ganzen Zahlen für die Kapazitäten.
Aber es ist irgendwie blöd. Und es gibt in der
Tat ein ganz einfaches Gegenbeispiel, dass das eine ganz,
ganz schlechte Schranke ist. Und das Bild sehen sie hier.
Also mein Netzwerk hat vier Knoten, die beiden,
es gibt quasi hier diese beiden relativ Pfade der Länge zwei
von dem Startknoten zum Zielknoten.
Und wir haben hier eine irre Kapazität von einer Million Einheiten
Zwischen UNV gibt es auch eine Kante, die hat eine Kapazität von einer Einheit.
Sollten ja ganz zahlig sein. So, was tue ich
jetzt? Ich sage, okay, ich nehme mir mal
diesen Pfad von S nach U nach V nach Tee.
Und entlang dieses Pfades habe ich eine Pfadkapazität von 1.
Ich kann den Fluss über diese Kante,
über diesen Pfad um eine Einheit vergrößern.
Okay, dann vergrößere ich den um eine. Dann habe ich
ein resituales Netzwerk, dann habe ich hier noch 999.999 Einheiten.
Und eine Einheit, die hier zurückließen lassen könnte.
Und hier das Gleiche. Und diese Kante hier,
die dreht sich jetzt um
Ja, weil ich habe jetzt keine Kapazität mehr um von U nach V zu fließen,
aber ich habe jetzt in der umgekehrten Richtung eine Einheit Kapazität.
Wenn ich jetzt den Pfad nehme von S nach V nach U nach T,
kann ich das Ganze wieder um eine Einheit vergrößern. Ja,
so, und das Ganze kann ich jetzt eine Million mal machen,
genau genommen kann ich sogar zwei Millionen mal machen, um rauszufinden,
dass der Fluss von S nach Tee der maximale zwei Millionen mitträgt.
Ja. Okay, ein ganz kleines Netzwerk,
was hier eine irre Laufzeit produzieren würde.
Ja. Auch Ford und Fulkassen das, was heißt auch,
die haben das natürlich nie so gemeint.
Und sie haben es auch nie so gemacht.
Und wahrscheinlich haben sie auch schon einen Verdacht,
was man in diesem Fall falsch gemacht hat.
Es gibt zwei Möglichkeiten, in die man jetzt so denken kann.
Die eine wäre zu sagen, ja,
wir müssen so einen Pfad suchen, wo der,
also eine möglichst große Restkapazität hat.
Dann würden wir ja sofort sehen, dass wir hier langlaufen
oder hier langlaufen. Das könnte man natürlich machen.
Das ist aber dann nicht so trivial zu berechnen.
Ja, also da müssen sie dann schon genau überlegen,
wie sie diesen Pfad jetzt finden können,
der so eine sehr große Restkapazität hat
Sie können aber auch was anderes machen.
Und das ist genau die Art und Weise,
wie Ford und Fulkas sind das eigentlich schon gemacht haben,
weil sie haben einfach gesagt, wir nehmen den kantenmäßig kürzesten Pfad.
Dann wäre das zumindest in diesem Beispiel nicht gegangen.
Dann wären wir also von S über U nach Tee gegangen,
weil das sind ja nur zwei Kanten und von S über
U nach V nach T, das sind ja drei Kanten.
Also in diesem Netzwerk wäre mit der Einschränkung,
wir nehmen immer den kürzesten Pfad,
wäre es gut gegangen und nach zwei Augmentierungsschritten hätten wir
den maximalen Fluss gefunden
Aber da stellt sich jetzt natürlich auch die Frage, funktioniert das? Wenn,
dann wäre das natürlich super, weil den kürzesten Pfad zu betrachten,
das ist ganz einfach, weil, naja,
wir müssen ja, wir haben ja noch nicht Markantenlängen.
Wir müssen ja nur die Anzahl der Kanten zählen. Und das heißt,
wenn wir eine Breitensuche verwenden,
finden wir ja automatisch den Kantenmäßig kürzesten Pfad zwischen S und T. Das heißt,
eine einfache Breitensuche mit Laufzeit dann O von E würde reichen,
gewürden den Kantenmäßig kürzesten Pfad finden und könnten
diesen sehr unangenehmen Fall hier ausschließen
Genau das funktioniert. Und diese Variante des Flussalgorithmus wird dann
nicht mehr nach Ford und Fullkassen benannt, sondern nach Edmonds und Carb.
Das ist der Edmonds & Carb-Algorithmus zur Berechnung des maximalen Flusses.
Und die beiden waren nämlich diejenigen, die gezeigt haben,
dass wenn man genauso argumentiert, entlang dieser kürzesten Pfade,
dann erreicht man eine wesentlich bessere Laufzeitschranke.
Also der Algorithmus wurde auch schon von Ford und Fullkassen
so beschrieben mit der breiten Suche,
aber die beiden hier,
die haben
die Laufzeit gezeigt
Okay, hier ist der, also die Methode.
Wir argumentieren entlang eines bezüglich der Kantenzahl kürzesten Pfades.
Den kürzesten Pfad finden wir ganz einfach mit einer breiten Suche,
ausgehend von unserem Startknoten S hier.
Und im Folgenden werden wir jetzt genau betrachten, was mit
der Länge der kürzesten Pfade passiert, während wir argumentieren.
Denn darüber kann man nachher sehen,
wie lange der Algorithmus benötigt oder wie viele Augmentierungsschritte er benötigt.
Und das ist das Schlüssellämmer hier von Edmunds und Carb,
was die beiden rausgefunden haben.
Und zwar haben sie sich angeguckt,
wie die kürzesten Pfade wachsen im resitualen Netzwerk
Die Erkenntnis ist nämlich, wenn ich ja argumentiere,
dann werden ja tendenziell immer mehr Kanten gesättigt und drehen ihre Richtung um.
Das heißt, der Pfad von S nach Tee,
der wird tendenziell länger. Also gefühlt ist es eigentlich schon klar,
die beiden werden sich voneinander entfernen im resitualen Netzwerk,
weil die kurzen Kantenwege,
da sättige ich die Kanten und den gibt es dann ja
nicht mehr in den kurzen, den kurzen Weg.
Und dann werden Kanten nur noch in der umgekehrten Richtung
da sein und die Pfade werden immer länger.
Und irgendwann ist dann der Punkt erreicht,
wo sich S und T voneinander trennen und wir
diesen Schnitt haben und dann sind wir fertig
Okay. Und Edmonds und Kaffee haben genau rausgefunden,
wie diese, wie sich dieses Delta verhält,
also wie die kürzesten Pfade sich verhalten.
Und zwar haben sie Folgendes gezeigt,
wenn wir also ein Flussnetzwerk haben mit Quelle und Senke.
Und dann betrachten wir alle Knoten V,
außer dieser Quelle und der Senke. Und für die gilt,
dass sich der Abstand der Knoten von der Quelle,
dass das, dass dieser Abstand monoton steigend ist.
Also es kann im Laufe des Algorithmus nie sein,
dass ein Knoten erst weiter weg ist von der Quelle
und dann wieder näher heranrutscht
Vorausgesetzt, wir argumentieren in dieser Reihenfolge entlang der kürzesten Pfade.
Okay, das ist quasi der Schlüssel, um die Laufzeit
zu zeigen. Und ja, wie sieht man das,
dass diese Pfade tatsächlich immer schrittweise dann länger werden?
Also es ist monoton steigend ist, weil es ist monoton steigend.
Das ist nicht streng monoton steigen. Also es können auch
über eine gewisse Zeit lang gleich bleiben. Aber irgendwann werden
sie dann größer. Wir werden nie kleiner. Ja,
um das zu zeigen, macht man einen Widerspruchsbeweis.
Wir haben also einen Fluss F und dann kommt die Augmentierung und danach haben wir den Fluss
Also wir betrachten genau den Zustand zwischen, der durch so
eine Augmentierung ausgelöst wird, also von F zu F-Strich.
Und jetzt betrachten wir diese kürzesten Pfade und je nachdem,
welchen Fluss wir gerade betrachten, sind die natürlich unterschiedlich.
Deswegen gibt es ein Delta F und ein Delta S-Strich.
Ich hoffe, das können Sie noch lesen.
Also hier ist ein F-Strich. So,
und wir vermuten jetzt mal, dass das nicht gilt.
Wir machen also einen Widerspruchsbeweis und sagen, okay,
da gibt es jetzt so einen Knoten-V,
der hat die Ei geschafft.
Wir haben also hier unseren Startknoten S.
Dieser Knoten-V, der liegt also jetzt hier irgendwo
V. Der hat die Eigenschaft, dass nachdem wir argumentiert haben,
der kürzeste Pfad zu V,
also das ist der Zustand hier mit dem Fluss F.
Und dann kommt ja, hier kommt die Augumentierung.
Und dann haben wir ja wieder ein S. Und jetzt gibt es
hier natürlich wieder den Pfad. Und jetzt gibt es hier
den Kloten V. Und hier haben wir den Fluss F-Strich.
Ja, jetzt haben wir sozusagen argumentiert und entsprechend den Fluss erhöht.
Und hier haben wir die entsprechenden Pfade.
Und das hier wäre jetzt das Delta F von SV,
also ist die Pfadlänge vorher und hier hätten wir das Delta-F-Strich von SV,
was ein bisschen interessiert. So, Edmonds und Carp
haben gesagt, das hier kann nicht kleiner sein als das.
Also die Farblänge kann nur größer oder gleich bleiben. Also,
nehmen wir mal das Gegenteil an,
wir tun mal so, als wenn das falsch wäre,
was die beiden hier gesagt haben und wir hätten jetzt tatsächlich so
einen Knoten-V gefunden und so einen F und einen F-Strich,
wo genau das passiert,
von denen wir hoffen,
dass es nicht passiert
Wir gucken uns jetzt den Pfad an, in A-Strich hier,
ja, und ich mache den mal hier noch eine Kante länger.
Na, dann ist das hier V, ja,
und wir gucken uns den Knoten an,
der da vorliegt, den brauchen wir jetzt immer.
Das ist also der Pfad in F-Strich, der uns hier zu V führt,
und das ist der kürzeste Pfad, den wir jetzt betrachten.
Ja, und U ist der Vorgänger entlang des kürzesten Pfades. Okay,
so, für kürzeste Pfade wissen wir, wir haben ja alle als Kantenlänge,
dass die Kantenlängen hier immer eins kürzer werden,
Also wenn das der kürzeste Pfad ist,
ist der Knoten offensichtlich eins näher an dem Quellknoten dran als der.
Das heißt, es gilt erst mal Delta F-Strich von SU
, ist Delta F-Strich von SV minus eins.
Also wenn wir davon einen abziehen, dann sind wir bei dem kürzesten Weg von denen.
Das bezeichne ich mal mit Sternchen, das benutzen wir gleich.
Und das ist einfach nur, weil UV diese Kante auf
dem kürzesten Pfad liegt von S nach V.
So, und dann gilt aber auch,
dass Delta F-Strich von SU ist größer gleich der LTF von SU
Ja, also das heißt,
der Pfad hier nach U ist größer gleich in diesem Netzwerk.
Hier kommt das U ja auch irgendwo vor. Warum ist das
so? Weil wir haben den Knoten V nicht irgendwie gewählt,
sondern wir haben den genommen, der am dichtesten dran liegt an der Quelle.
Die Technik kennen Sie schon. Das haben wir schon ein
paar Mal gemacht. Also wenn wir einen Widerspruchsbeweis in Grafen,
das ist eine ganz beliebige Technik,
wir nehmen einfach das Gegenteil an und suchen uns dann den Knoten aus,
der am dichtesten dran liegt, der einen Widerspruch hervorruft.
Und damit wissen wir nämlich, dass der Knoten,
der davor ist, keinen Widerspruch hervorrufen darf.
Deswegen müssen wir für diesen Knoten hier, darf das nicht gelten.
Ja, für den gilt noch die Aussage unseres Slammers.
Das heißt, Delta F-Strich von SU ist größer gleich Delta F von SU.
Also für den ist der Pfad noch länger geworden. Okay,
die Kante von U nach V, die kann in diesem Netzwerk nicht existieren.
Also hier gibt es ja auch irgendwie mal ein EU.
Also diese Kante hier, die kann es nicht geben.
Warum kann es die nicht geben? Ja,
wie soll die existieren, wenn der Pfad hier,
der ist ja quasi, von dem wissen wir,
dass er kürzer war als hier und wenn es diese Kante geben würde,
dann könnte es ja nicht sein,
dass sich die Entfernung von V entsprechend verringert hat.
Also diese Kante kann irgendwie in dem Grafen nicht da sein.
Und denn, wenn es sie geben würde, dann würde nämlich gelten Delta
F von SV, ist kleiner Gericht Delta F von SU
plus 1, weil wir haben ja die Dreiecksung gleich.
Und wenn es diese Kante gibt hier,
dann gilt natürlich für die Kante die Dreiecksungleichung.
Und wir wissen, dass für den Knoten U ist halt
das Delta F-Strich von SU kleiner gleich dem Delta F von SU.
Und dann hätten wir hier das ist der kürzeste Pfad.
Also würde hier stehen, dass das Delta F von SV,
kleiner gleich den Delta F-Strich von SV ist.
Und das wollten wir ja nicht. Wir haben ja gesagt,
dieser Knoten V hat gerade die Eigenschaft,
dass die Pfadlänge von hier oder hier in der Augmentierung länger wir kürzer wird.
Okay, so und nun, wir wissen, diese Kante existiert hier nicht.
Hier existiert sie nicht. Hier existiert sie. Geht das
? Kann es sein? Das sind die resitualen Netzwerke.
Hier gibt sie nicht, hier gibt sie.
Klar kann das sein. Das kann nämlich sein,
wenn wir über diese Kante augmentieren, Wenn wir Fluss darüber pumpen,
das ist die einzige Möglichkeit, wie eine Kante,
die hier nicht existiert, hier erzeugt wird.
Okay, das heißt, wenn wir argumentieren,
wenn bei der Erweiterung von F nach Eschrich,
dann argumentieren wir, dann haben wir das gemacht,
indem wir den Fluss von V nach U erhöht haben.
Wir haben hier in diese Richtung Fluss runtergepumpt und dadurch ist
in der Gegenrichtung die Kante von U nach V entstanden.
Nur so kann die Kante in diesen Grafen reingekommen sein
Aber wenn wir über diesen Pfad in diese Richtung Fluss
gepumpt haben, dann war das ja ein kürzester Pfad.
Das heißt, diese Kante von V nach uh,
die lag auf dem kürzesten Pfad zum Zeitpunkt F.
Sonst hätten wir da ja nicht drüber argumentiert.
Wir argumentieren ja nur über kürzeste Fahne. Deswegen ist Delta FSV gleich
Delta FSU minus eins. Ist einfach nur kürzeste Pfade,
entlang des kürzesten Pfades verringern sich die Längen immer um eins.
Und jetzt können wir, wissen wir, dass das Delta
F von SU kleiner gleich den Delta F-Strich von SU ist.
Das haben wir gerade gesehen. Und wir haben auch gesehen,
dass das Delta F-Strich von SU höchstens,
oder Delta F-Strich von SV minus 1 entspricht.
Und dann haben wir das hier stehen.
Und hier haben wir unseren Widerspruch. Jetzt haben wir gesehen,
dass das Delta F von SV kleiner gleich dem Delta F-Strich von SV ist.
Also, dass der Werk, dass die Entfernung kürzer geworden sein muss.
Und das ist genau das, was wir sehen wollten.
Ja, und das ist ein Widerspruch zu unserer Annahme.
In dem Beweis sieht man noch etwas, was im Folgenden noch wichtig wird.
Wir sehen nämlich nicht nur, dass es kürzer wird,
sondern wir sehen auch, um wie viel wir sehen,
dass diese Fahrtlänge um zwei Einheiten,
um mindestens zwei Einheiten kürzer wird
Vorausgesetzt, wir haben über diese Kante argumentiert.
Wenn wir über diese Kante von UNAV argumentieren,
dann verringert sich die Pfadlänge von diesem KnotenV um zwei Einheiten.
Dann erhöht sich, Entschuldigung, er erhöht sich
die Fahrtlänge um zwei Einheiten. Okay, so,
das Bild in etwas schöner, hatten wir gerade hier schon.
Ja, also hier nochmal, das ist nachher.
Nachher wissen wir, wir haben den kürzesten Pfad von S
nach V. Das geht über diese Kante von U nach V.
Hier, das ist der untere Bild
Ja, und wir wissen, dass deswegen in dem ursprünglichen
Grafen diese Kante nicht existieren kann, die ist durchgestrichen.
Das ist die von UNAV. Hier ist das umgedreht,
das Bild. Und dass der kürzeste Pfad daher da langgehen
muss. Und das hat gerade zum Widerspruch geführt.
Okay, das ist ein nicht so einfacher Beweis.
Der ist jetzt hier nur so zwei Folien lang,
aber da muss man ein bisschen drüber nachdenken,
dass man hier mit dem Vorher und Nachher und wie die Kanten liegen.
Also das müssen sie sich nochmal, kann sich nochmal in Ruhe anschauen.
Und dann ist es, glaube ich, klar.
Okay, so, und daraus kommen wir die Laufzeit abschätzen
für den Edmonds Carpe Algorithmus
Und zwar definieren wir eine sogenannte kritische Kante.
Und zwar ist die kritische Kante gerade die,
die beim Argumentierenden Pfad dieses Minimum definiert. Also die,
die gesättigt wird. Also es gibt ja mindestens eine Kante,
wo dann die Restkapazität gerade der Kapazität des Pfades entspricht und
die wird dann gesättigt und verschwindet dann ja aus dem Grafen.
Das ist dann die sogenannte kritische Kante.
Und diese kritische Kante verschwindet in dem resitualen Netzwerk,
weil über die pumpen wir Fluss und danach ist die Kapazität
ausgeschöpft und dann ist dem resitualen Netzwerk zunächst mal nicht mehr da.
Die kann später wiederkommen, aber erstmal ist sie weg
Okay, so, das ist die entscheidende Erkenntnis jetzt,
mit der wir oder die entscheidende Definition, die wir brauchen,
um die Laufzeit des Edmunds Cap-Algorithmus zu sehen.
Die steht hier, wenn also ein Flussnetzwerk da ist mit Quelle und Senke,
dann können wir die Anzahl der Flusserweiterungen im Edmunds Cap-Algorithmus auf O von V mal E beschränken.
Also es gibt höchstens V mal eh viele Augmentierungsschritte,
bis wir den Zustand erreicht haben, dass wir den Maximaleinfluss berechnet haben.
Und weil wir schon wissen, dass wir zur Berechnung eines Augmentierungsschrittes,
also Suche des kürzesten Pfades und das Argumentieren,
O von e viel Zeit benötigen, folgt dann daraus sofort,
dass die Worst-Case-Laufzeit des Algorithmus O von V mal e-Quadrat ist.
Okay, so, wie sieht man das? Wir betrachten
so eine kritische Kante von UV in dem zum Zeitpunkt F1.
Wir haben also jetzt einen Fluss und wir haben den Zeitpunkt F1,
also wir haben ja ganz viele Flüsse, das wächst ja so langsam,
also mit jeder Augmentierung wird das ein bisschen mehr und irgendwie haben wir jetzt F1,
der Zustand F1 und wir haben jetzt so eine Kante,
Die ist kritisch.
Also wir haben, wir augmentieren dann von S nach T.
Und das ist hier unser Augmentierungspfad P. Und hier haben wir
eine Kante drin von hier nach hier.
Das ist uh. Und das ist V. Und die ist
kritisch. Das heißt, das ist diejenige,
die beim Augmentieren über P hier gesättigt wird und danach verschwindet.
Jetzt wissen wir, diese Kante liegt auf dem kürzesten Pfad.
Das heißt, in diesem Netzwerk gilt das Delta F1 SV,
gleich Delta F1 SU plus 1 ist.
Das ist der kürzeste Pfad. Das heißt,
der Knoten ist einzelne Jahr dran an S
als der
So, jetzt haben wir argumentiert über diesen Pfad,
jetzt kommt also der Argumentierungsschritt. Und wenn wir jetzt argumentiert haben,
dann wissen wir, dass diese Kante weg ist.
Also die anderen können noch existieren, wir haben hier S,
irgendwie so, ja, die Kante gibt es nicht mehr.
Es kann sein, dass es, was heißt es kann sein,
wir wissen, es wird die Kante in Gegenrichtung geben.
Die gibt es, garantiert sogar,
weil wir haben ja Fluss in die Richtung gepumpt.
Also die Kante existiert, aber es gibt diesen ursprünglichen kürzesten
Weg nicht mehr. Also den gibt es nicht mehr,
ja, kann nicht mehr, weil die Kante existiert ja
nicht mehr
in die Richtung
Es gibt jetzt einen anderen kürzesten Pfad, der geht hier irgendwo an.
Aber diese Kante hier, die kommt da nicht vor.
Ich meine, die könnte vorkommen,
vielleicht kommt die auch im kürzesten Pfad sogar vor.
Aber wenn die auf den kürzesten Pfad vorkommt,
dann natürlich in umgekehrter Richtung, dann heißt,
dann müssten wir hierhin laufen und dann hier entsprechend zurück.
Aber die Richtung gibt es so erstmal nicht mehr. Okay,
so, das heißt, nach der Flusserweiterung sind wir bei F2 angekommen,
also hier. Und die Kante existiert nicht mehr.
Und bevor sie das nächste Mal kritisiert, werden kann.
Also bevor wir sie das nächste Mal verwenden können und sie wird kritisch,
müssen wir als erstes mal einmal von V nach U Fluss leiten.
Nur wenn wir in diese Richtung Fluss leiten,
entsteht wieder die Kante von U nach V. Okay, das heißt,
wir haben dann den Zustand GF3 und dann wissen wir zu dem Zeitpunkt,
liegt, liegt die Kante von U nach V auf dem kürzesten Pfad.
Das heißt, nein, die Kante von V nach U
auf dem kürzesten Pfad. Das heißt, zu dem Zeitpunkt
F3 ist Delta F3,
SU gleich Delta
SV plus 1. Okay, das können wir jetzt einsetzen und dann sehen wir,
dass Entlang dieses Prozesses ist die Entfernung von dem Knoten U um zwei Einheiten gewachsen.
Also wir argumentieren in diese Richtung, die Kante ist weg,
danach argumentieren wir in diese Richtung,
die Kante kommt wieder rein und dann können wir wieder in die andere Richtung argumentieren und zu dem Zeitpunkt,
wo wir wieder in die andere Richtung argumentieren,
wo wir also wieder die Möglichkeit haben,
von U nach V zu argumentieren, das ist der Zeitpunkt F3,
Zu dem Zeitpunkt wissen wir,
dass wir hier tatsächlich den Knoten U um mindestens zwei Einheiten von der Quelle weggeschoben haben.
Weil, ja, den Beweis haben wir eigentlich gerade schon gesehen.
Das ist genau das Argument, da habe ich gerade darauf hingewiesen,
dass sich die Pfadlänge eben entsprechend verlängert auf dem Weg.
Okay, so, und damit ist eigentlich klar,
was passiert. Also zwischen zwei Augmentierenden Faden oder Erweiterungsflüssen,
auf denen diese Kante UV kritisch ist,
hat sich also die Entfernung von dem Knoten U,
um mindestens zwei Kanten verlängert.
Jetzt wissen wir, wie lange kann ein Pfad maximal werden?
Wir haben einfache Pfade. Das bedeutet, eine Pfadlänge,
die Fahrtlänge von SU ist beschränkt durch Betrag von V minus 2.
Oder es wird irgendwann unendlich, wenn wir den Knoten nicht mehr erreichen,
aber das ist sozusagen das Maximum.
Und das bedeutet, dass wir eine Kante im Verlauf des Algorithmus,
natürlich nur Betrag von V minus 2 halbe Mal
kritisch machen können.
Häufiger kann die nicht
kritisch sein
Weil jedes Mal, wenn sie kritisch ist, verlängert sich der Vater und zwei.
Und irgendwann haben wir dann den maximalen Fahrtlänge erreicht.
Bei jeder Flusserweiterung gibt es eine kritische Kante. Das bedeutet,
es gibt maximal Betrag von ehemal V halbe minus eins,
viele Flusserweiterungen. Jede Flusserweiterung,
eine kritische, es gibt Betrag von ehe viele Kanten,
wenn sie einmal eingekannte kritisch war, dann wird sie,
verlängern sich die Pfade und das Ganze geht nur V minus zwei halbe Mal.
Das ist also die Anzahl der Flusserweiterungen, die es gibt. Und damit wissen wir,
dass mit der Laufzeit von O von E pro Flusserweiterung,
wir eine Gesamtlaufzeit von O von V mal e-Quadrat erreichen.
Ja, okay. Das ist sozusagen der Beweis,
den Edmonds und Carp geliefert haben, um zu zeigen,
wie die Laufzeit des Algorithmus eigentlich ist.
Ja, also das heißt, der Ford Fulkas ein Algorithmus,
den ich Ihnen präsentiert habe, so wie Sie ihn schon damals formuliert hatten,
hat er im Prinzip schon Breitensuche benutzt.
Der Algorithmus wurde also von Edmonds und Carp eigentlich gar nicht angefasst.
Das ist noch der gleiche, aber Edmonds und Carp haben dann gezeigt,
dass wenn man entlang dieser kürzesten Pfade augmentiert, wir genau diese Laufzeitschranke erreichen.
Und wir haben unseren ersten Flussalgorithmus mit einer sinnvollen Laufzeitschranke,
nämlich V mal eh Quadrat. Das ist sozusagen add once carp.
Und die Frage ist natürlich, kann man das weiter reduzieren?
Ja, das ist auf O von V
mal eh Quadrat
Wenn man da mal drauf guckt, dann ist das eigentlich
schon, das ist nicht wenig, ja.
Also, dass es auf alle Fälle mal kubisch mit der
Größe des Grafen, ja.
Also, das wächst schon substanziell. Und dann stellt sich,
wie gesagt, die Frage, was kann man das irgendwie reduzieren?
Wir brauchen jetzt vielleicht eine Idee, um die ganze Sache effizienter zu gestalten.
Historisch war es so, dass quasi parallel zu Edmunds und Carb
auch Denage an Flussalgorithmen gearbeitet hat und er mehr oder
weniger zeitgleich einen Algorithmus veröffentlicht hat
Der fast genauso funktioniert, wie die Ford-Fullkassen-Methode und das,
was Edmonton Carp dann vorgestellt haben.
Er hat allerdings eine Sache geschickt da gemacht.
Und diese eine Sache führt tatsächlich zu einer besseren Laufzeitschranke.
Ich verrate ihm mal schon mal, was da rauskommt.
Limit schafft O von V-Quaddrat mal E. Und das ist natürlich ein Vorteil,
weil wir wissen, es gibt mal mindestens so viele Kanten
wie Knoten und wenn der Graf einigermaßen dicht ist,
dann können es sogar quadratisch viele Kannten sein im Verhältnis zur Anzahl der Knoten.
Also insofern ist das schon substanziell. Und der Dienisch-Algorithmus hatte
noch einen anderen Vorteil, den wir später sehen werden.
Der dienische Algorithmus ist eine Grundlage für ein Matching-Verfahren, für ein wichtiges.
Ja, was hat der Dienisch anders gemacht? Also wo
ist dieser eine Unterschied, der die Laufzeit schneller macht?
Ich weiß nicht, ob sie schon immer,
also wenn man sich so einen Algorithmus so anguckt und darüber nachdenkt,
dann hat man ja manchmal selber auch so Ideen,
wo irgendwo was rauszuholen ist, wo man sich dann sagt,
ja,
das ist irgendwie noch ungeschickt.
Das könnte irgendwie auch
noch besser gehen oder so
Ich weiß nicht, wie es ihnen so ergeht,
aber wenn man auf diesen Algorithmus draufschaut, ich finde das,
was wirklich tatsächlich ja ein bisschen lahm aussieht und auch natürlich ist,
ist, dass man immer nur noch einem Pfad irgendwie sucht.
Einen so einem Faden argumentiert, man sucht mal in der
nächsten Pfad. Und wir haben ja auch gesehen,
dass das genau ein Problem ist, weil wir so unheimlich
viele Pfade produzieren, bevor wir dann irgendwann mal fertig sind.
Und genau das macht Denage nicht. Er sucht nicht nach Pfaden,
sondern er fasst einfach eine ganze Reihe von Schritten zusammen
Er argumentiert auch. Also ich habe ja gesagt,
die Änderung ist nur relativ klein. Er definiert auch einen Fluss,
er macht auch eine Augmentierung, er vergrößert den Fluss,
aber er macht es nicht über einen Pfad.
Er guckte sich auch kürzeste Pfade an. Der Unterschied ist,
Dinitsch sagt sich, ich gucke mir einfach aller kürzesten Pfade gleichzeitig an.
Und augmentiere über alle diese kürzesten Pfade in einem Schritt.
Ja, das ist der eine Unterschied, den er macht.
Diesen Fluss, den man da erzeugen muss,
um das zu tun, ist ein sogenannter blockierender Fluss oder
Blocking Flow
Also die Idee von Denic war, wie beim Ed Bonds Carp,
argumentieren wir, über kürzeste Pfade,
aber nicht über Einfahrt nah und dann wieder den nächsten und den nächsten,
also nicht sequenziell überkürzte Pfade,
sondern wir gucken uns alle kürzesten Pfade gleichzeitig an.
So, ein blockierender Fluss in einem Flussnetzwerk ist ein Fluss,
der die Eigenschaft hat, dass alle kürzesten Pfade von S nach T sind saturiert.
Also es gibt auf jedem kürzesten Pfad mindestens eine Kante,
wo die Kapazität dem Fluss entspricht und dadurch der kürzeste Pfad
abgebrochen,
also unterbrochen wird
Okay, das ist ein blockierender Fluss und den müssen wir berechnen.
Und der Deenage-Algorithmus ist dann wie folgt.
Also wir beginnen, alles ist null, wir am Anfang.
Solange so ein blockierender Fluss existiert, ja,
wie der hier im Restnetzwerk, augmentieren wir einfach. Das heißt,
wir gucken uns alle Kanten an, das ist der Augmentierungsschritt,
wenn die Kante UV in der gleichen Richtung verläuft wie die im resitualen Netzwerk,
dann addieren wir den Fluss und anderenfalls subtrahieren wir den Fluss,
weil dann war er ja wieder in der Gegenrichtung.
Also das ist genau das Gleiche. Und der einzige Teil,
wo wir einen Unterschied sehen, zum Edmonds Carp ist Hier in dieser Wild-Bedingung.
Wir suchen keinen Pfad, sondern wir suchen so einen blockierenden Fluss. Okay,
das erste, was man da mal sehen kann,
ist, dass es davon,
also dass wir quasi in diesem Schema zunächst mal auch noch
in O von E-Zeit diese Augmentierung durchführen können.
Vorausgesetzt, wir sind in der Lage, hier diesen blockierenden Fluss zu finden.
Das müssen wir noch zeigen. Aber wenn wir den haben,
dann kostet der Rest von dieser Denage-Funktion auch wieder O von
E. Also die Laufzeit wird sein O von E mal,
die Zeit, die wir brauchen,
um den blockierenden Fluss zu berechnen,
mal die Anzahl der Iteration dieser Wild-Schleife
Also wie viele Blockier eine Flüsse gibt es?
Das ist die erste Frage. Und wie lange brauchen wir,
um den Blockieren den Fluss zu berechnen?
Das ist die zweite Frage. Okay, so,
wie viele Augmentierungen gibt es, wenn wir, wenn wir blockierende Flüsse nehmen?
Der entscheidende Unterschied ist jetzt, naja, wir haben,
das war der Beweis von Edmonds und K,
wo wir gesehen haben, dass die kürzesten Pfade monoton wachsen,
monoton wachsen bedeutet,
sie können eine gewisse Zeit lang gleich bleiben und dann kommt
der Schritt,
wo sie dann sich vergrößern
Aber sie werden nie kürzer. Also sie haben Edmonton Carpe
, haben gezeigt, sie werden nie kürzer.
Denitsch hat gezeigt, wenn man blockierende Flüsse nimmt,
dann ist diese Länge der kürzesten Pfade streng monoton steigen.
Das heißt, man kann zeigen,
in jedem Schritt verlängern sich tatsächlich die Pfade,
weil wir alle kürzesten Pfade gleichzeitig betrachten.
Also hier ist das Lämmer,
wenn wir also ein Flussnetzwerk haben mit Quelle und Senke,
dann terminiert der Denitsch-Algorithmus nach Betrag von V
minus 1 vielen Blockierungsschritten
Ja, und hier sehen Sie genau den Unterschied.
Wir brauchen nur Betrag von V viele Blockierungsschritte.
Im Gegensatz zu V mal eh viele argumentierende Pfade im Admonscap-Algorithmus.
So, wieso sind das nur Betrag von V minus eins,
viele Blockierungsschritte? Wir gucken uns wieder die kürzesten Pfade an.
Und wir haben jetzt also mit Delta F wieder die
kürzesten Fahrtlängen von UNAV. Und was wir machen ist,
dass wir uns die Pfadlänge von S nach Tee angucken.
Also zwischen Quelle und Senke. Zwischen den beiden. Und
diese Pfadlänge die ist ja auch ein kleiner gleicher Betrag von
V minus 1. Zumindest solange der Algorithmus noch nicht terminiert.
Irgendwann ist es dann unendlich. Also der letzte Schritt ist dann,
dass es unendlich wird. Aber solange der Algorithmus noch nicht terminiert,
ist die Pfadlänge von S nach T natürlich höchstens Betrag von V minus 1,
weil der Pfad ist einfach und mehr Kanten gibt es nicht.
Also mehr Knoten gibt es nicht, die sie auf dem Pfad platzieren können.
Okay, und genau diese Pfadlänge hier, die ist streng monoton steigen.
Und wenn die streng monoton steigend ist mit jedem Blockierungsschritt,
ist auch klar, dass sie nicht mehr als Betrag
konform minus eins viele Blockierungsschritte haben können
Okay, wir wissen aus dem Lämmer von Edmunds Carb,
dass die Entfernung für einen beliebigen Knoten monoton steigend ist.
Das haben wir schon gesehen. Also das können wir jetzt
einfach mal benutzen. Der Dienisch hat das nicht benutzt,
weil die haben das ja gleichzeitig gemacht,
aber wir haben das eine ja schon gesehen.
Also wir benutzen das. Wir wissen also,
Delta FSV ist monoton steigend. Und wir gucken uns wieder
einen Augmentierungsschritt an. Wir haben also F,
den Fluss vorher und F-Strich den Fluss nach dieser Augmentierung.
Durch einen blockierenden Fluss FB. Wir nehmen wieder das Gegenteil an.
Also wir wissen schon, kleiner werden kann es auf keinen Fall,
Das gilt ja auch für die Senke Tee.
Das heißt, mal angenommen, die Entfernung ändert sich nicht.
Also Delta ST ist Delta F-Strich von ST. Das heißt,
der Knoten Tee hat sich nicht durch den Argumentierungsschritt weiter von der Quelle weg entfernt.
Okay, wir gucken uns einen Pfad minimaler Länge an nach der Augmentierung.
Das ist der Pfad P, da gibt es irgendwie diese Kante UV drauf.
Und wir wissen, dieser Pfad kann nicht in F existiert sein haben.
Warum nicht? Weil wenn es dem Pfad schon gegeben hätte,
dann wäre das ein Teil der Kürze ist ein Pfade gewesen zwischen S und T.
Und der blockierende Fluss hat ja die Eigenschaft,
dass alle kürzesten Pfade saturiert werden. Das heißt,
dass es da mindestens eine Kante gibt, die gesättigt ist.
Das heißt, dieser Pfad, der die gleiche Länge hat,
wie die kürzeste Pfadlänge vor der Argumentierung, kann vorher nicht existiert haben.
Und jetzt ist die Argumentation genauso wie bei Edmonds Car.
Was wir einfach sagen ist, okay,
wir nehmen eine Kante raus und das ist eine Kante,
die nicht existiert hat.
Also die gibt es im GF nicht.
Und jetzt nehmen wir die maximale. Also die,
die am weitesten weg ist von dem Startknoten
Und dann wissen wir über diese Kante muss Fluss gelaufen sein,
denn die Kante ist nicht in F gewesen,
ist aber nachher in F-Strich.
Das heißt, die muss hineingekommen sein durch die letzte Augmentierung.
Damit lag die Kante von V nach U auf dem kürzesten Pfad von GF.
Und jetzt machen wir genau das gleiche, gleicher Beweis,
analog zu dem Beweis, den wir gesehen haben, gilt dann,
dass die Seed-Pfadlänge für den Knoten V um zwei Einheiten verlängert hat.
Also wir wissen, wenn die Kante in diese Richtung da
ist und danach müssen wir erst einmal in der Gegenrichtung aufmentieren,
verlängert sich der Pfad um zwei Einheiten,
mindestens zwei Einheiten
So, da der Knoten,
uh, der war der maximal weit entfernt,
ist von der Quelle mit dieser Eigenschaft,
existiert der Fahrt von V nach Tee,
also der Rest hier sozusagen in dem Vater,
den gibt es, weil sonst hätten wir einen Knoten genommen,
der weiter hinten liegt und den nach haben wir einen Widerspruch,
denn dann ist das Delta-F-Strich von SD größer geworden als das Delta-F von ST.
Okay, das Bildchen hierzu,
kann ich Ihnen sonst nächstes Mal nochmal anmalen,
sonst können Sie sich es auch selber mal aufmalen,
aber damit haben wir gesehen, okay,
wenn wir so einen blockierenden Fluss finden,
dann wissen wir,
dass wir nur noch Betrag von V minus 1
Blockierungsschritte brauchen
Diese Schleife hier, die Anzahl der Schleifendurchläufe für diese Wildsteife,
die haben wir schon beschränkt auf Betrag von V4.
Und was wir jetzt noch tun müssen, ist,
wir müssen jetzt noch rausfinden,
wie wir diesen blockierenden Fluss berechnen können und wie lange das dauert.
Das machen wir natürlich nicht mehr heute