<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Goldberg-Tarjan-Algorithmus</id>
	<title>Goldberg-Tarjan-Algorithmus - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Goldberg-Tarjan-Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Goldberg-Tarjan-Algorithmus&amp;action=history"/>
	<updated>2026-06-07T01:38:37Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Goldberg-Tarjan-Algorithmus&amp;diff=1777533&amp;oldid=prev</id>
		<title>89.1.213.130: /* Quellen */ Typo</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Goldberg-Tarjan-Algorithmus&amp;diff=1777533&amp;oldid=prev"/>
		<updated>2025-04-11T23:58:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Quellen: &lt;/span&gt; Typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Goldberg-Tarjan-Algorithmus&amp;#039;&amp;#039;&amp;#039;, auch &amp;#039;&amp;#039;&amp;#039;Push-Relabel-Algorithmus&amp;#039;&amp;#039;&amp;#039; genannt, ist ein Algorithmus aus der [[Graphentheorie]] zur Berechnung eines [[Flüsse und Schnitte in Netzwerken|maximalen Flusses in einem Netzwerk]]. Er wurde von Andrew Goldberg und [[Robert Tarjan|Robert Endre Tarjan]] entwickelt und 1988 publiziert.&amp;lt;ref&amp;gt;{{Literatur |Autor=Andrew Goldberg, Robert Tarjan |Titel=A new approach to the maximum flow problem |Sammelwerk=[[Journal of the ACM]] |Band=35 |Jahr=1988 |Seiten=921–940}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Der Algorithmus ==&lt;br /&gt;
Im Folgenden bezeichnet im Netzwerk &amp;lt;math&amp;gt;(G, u, s, t)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; den gerichteten Graphen, &amp;lt;math&amp;gt;u\colon E(G) \rightarrow \mathbb{R}_+&amp;lt;/math&amp;gt; die Kapazitätsfunktion (wobei &amp;lt;math&amp;gt;u(e)&amp;lt;/math&amp;gt; die Kapazität einer Kante &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; angibt), &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; den Knoten, von dem der Fluss startet, und &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; den Zielknoten des Flusses. &amp;lt;math&amp;gt;V(G)&amp;lt;/math&amp;gt; bezeichnet die Knotenmenge des Graphen &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;E(G)&amp;lt;/math&amp;gt; die Kantenmenge und &amp;lt;math&amp;gt;\delta^+(v)&amp;lt;/math&amp;gt; die Menge der Kanten, die den Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; verlassen.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus berechnet einen maximalen s-t-Fluss, indem er einen s-t-Präfluss &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; so lange modifiziert, bis er ein s-t-Fluss ist. Tritt dies ein, ist der erhaltene s-t-Fluss auch maximal. Der Algorithmus arbeitet des Weiteren mit einer Distanzmarkierung, d.&amp;amp;nbsp;h. mit einer Funktion &amp;lt;math&amp;gt;\psi\colon V(G) \rightarrow \mathbb{N}_0&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;\psi(s)=|V(G)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\psi(t)=0&amp;lt;/math&amp;gt; und für alle Kanten &amp;lt;math&amp;gt;e=(v,w)\in G_f: \ \psi(v) \leq \psi(w) +1&amp;lt;/math&amp;gt;. Eine Kante &amp;lt;math&amp;gt;(v, w) \in E(G_f)&amp;lt;/math&amp;gt; des [[Residualgraph]]en &amp;lt;math&amp;gt;G_f&amp;lt;/math&amp;gt; heißt erlaubt, wenn sie &amp;lt;math&amp;gt;\psi(v) = \psi(w) +1&amp;lt;/math&amp;gt; erfüllt.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus arbeitet wie folgt:&lt;br /&gt;
&lt;br /&gt;
# Setze für alle Kanten &amp;lt;math&amp;gt;e\in \delta^+(s)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;f(e):=u(e)&amp;lt;/math&amp;gt;, und für alle anderen Kanten &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;f(e):=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Setze &amp;lt;math&amp;gt;\psi(s):=|V(G)|&amp;lt;/math&amp;gt; und für alle anderen Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\psi(v):=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Solange es einen aktiven Knoten &amp;lt;math&amp;gt;v\in V(G)&amp;lt;/math&amp;gt; gibt (d.&amp;amp;nbsp;h. einen Knoten &amp;lt;math&amp;gt;v\in V(G)\setminus \{s, t\}&amp;lt;/math&amp;gt;, auf dem mehr Fluss ankommt als abfließt), wähle so einen Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; und führe aus:&lt;br /&gt;
#: Wenn im [[Residualgraph]]en &amp;lt;math&amp;gt;G_f&amp;lt;/math&amp;gt; keine erlaubte Kante den Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; verlässt, setze &amp;lt;math&amp;gt;\psi(v):=\min\{\psi(w)+1 \mid \exists e\in E(G_f): e=(v, w) \}&amp;lt;/math&amp;gt;&lt;br /&gt;
#: Ansonsten augmentiere &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; entlang einer erlaubten Kante &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;, die &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; verlässt (d.&amp;amp;nbsp;h.: Falls &amp;lt;math&amp;gt;e\in E(G)&amp;lt;/math&amp;gt; ist, setze &amp;lt;math&amp;gt;f(e):=f(e)+\min\{u_f(e), \operatorname{ex}(v)\}&amp;lt;/math&amp;gt;; andernfalls ist &amp;lt;math&amp;gt;e\in E(G_f)\setminus E(G)&amp;lt;/math&amp;gt;, und somit &amp;lt;math&amp;gt;e=\overleftarrow{g}&amp;lt;/math&amp;gt; Rückkante einer Kante &amp;lt;math&amp;gt;g\in E(G)&amp;lt;/math&amp;gt;, dann setze &amp;lt;math&amp;gt;f(g):=f(g)-\min\{u_f(e), \operatorname{ex}(v)\}&amp;lt;/math&amp;gt;. Hierbei bezeichnen &amp;lt;math&amp;gt;u_f&amp;lt;/math&amp;gt; die Residualkapazitäten und &amp;lt;math&amp;gt;\operatorname{ex}(v)&amp;lt;/math&amp;gt; den Überschuss am Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, also die Differenz des an &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; ankommenden und des abfließenden Flusses.).&lt;br /&gt;
&lt;br /&gt;
Eine Modifikation des Flusses &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; in Schritt 3 wird auch „Push“ genannt, eine Modifikation der Distanzmarkierung &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt; „Relabel“. Daher rührt der Name Push-Relabel-Algorithmus.&lt;br /&gt;
&lt;br /&gt;
Am Ende ist &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; ein maximaler s-t-Fluss. Denn zu jedem Zeitpunkt ist der Knoten &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; die einzige Quelle und der Algorithmus hält erst an, wenn der Knoten &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; die einzige Senke ist. Da &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt; stets eine Distanzmarkierung bleibt und damit die oben beschriebenen Eigenschaften erfüllt, ist gewährleistet, dass im Residualgraphen &amp;lt;math&amp;gt;G_f&amp;lt;/math&amp;gt; der Knoten &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; niemals von der Quelle &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; aus erreichbar ist. Damit ist sichergestellt, dass der vom Algorithmus berechnete s-t-Fluss tatsächlich ein maximaler s-t-Fluss ist.&lt;br /&gt;
&lt;br /&gt;
== Laufzeit ==&lt;br /&gt;
So allgemein wie oben angegeben hat der Algorithmus eine Laufzeit von &amp;lt;math&amp;gt;\mathcal{O}(|V(G)|^2 \ |E(G)|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wählt man in Schritt 3 des Algorithmus immer einen aktiven Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, für den unter allen aktiven Knoten die Distanzmarkierung &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt; maximalen Wert hat (also ein &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;\psi(v)=\max\{\psi(x) \mid x \text{ ist aktiver Knoten}\}&amp;lt;/math&amp;gt;), lässt sich eine Laufzeit von &amp;lt;math&amp;gt;\mathcal{O}(|V(G)|^2 \sqrt{|E(G)|})&amp;lt;/math&amp;gt; beweisen. Bei der Implementierung erfordert dies jedoch, dass für jeden Wert &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;2\mathopen|V(G)\mathclose|-2&amp;lt;/math&amp;gt; jeweils eine Liste aller aktiven Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;\psi(v)=i&amp;lt;/math&amp;gt; geführt wird (also für jeden Wert, den &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt; theoretisch annehmen kann), zusätzlich muss das jeweils aktuelle Maximum von &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt; auf der Menge der aktiven Knoten nachgehalten werden. Dies ist erforderlich, damit in jedem Durchlauf der Schleife ein aktiver Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; mit maximalen &amp;lt;math&amp;gt;\psi(v)&amp;lt;/math&amp;gt; ohne Laufzeitverlust gewählt werden kann.&lt;br /&gt;
&lt;br /&gt;
Mit ausgeklügelteren Implementierungen lassen sich auch Laufzeiten von&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathcal{O}(|V(G)| \ |E(G)| \ \log_{2+\frac{|E(G)|}{|V(G)| \log (|V(G)|)}}(|V(G)|))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathcal{O}(\min\{\sqrt{|E(G)|}, \sqrt[3]{|V(G)|^2}\} \ |E(G)| \ \log \left(\frac{|V(G)|^2}{|E(G)|}\right) \ \log (u_{\max}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erreichen&amp;lt;ref&amp;gt;{{Literatur|Autor=Bernhard Korte, Jens Vygen|Titel=Combinatorial Optimization|Jahr=2006|Seiten=168|Auflage=3.}}&amp;lt;/ref&amp;gt;. Hierbei bezeichnet &amp;lt;math&amp;gt;u_{\max}&amp;lt;/math&amp;gt; den maximalen Wert der Kapazitätsfunktion &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* [[Dieter Jungnickel]]: &amp;#039;&amp;#039;Graphs, Networks and Algorithms&amp;#039;&amp;#039;, Springer (1998) ISBN 978-3-540-72779-8&lt;br /&gt;
* [[Bernhard Korte]], [[Jens Vygen]]: &amp;#039;&amp;#039;Kombinatorische Optimierung: Theorie und Algorithmen&amp;#039;&amp;#039;. Aus dem Englischen von Rabe von Randow. Springer-Verlag, Berlin / Heidelberg 2008, ISBN 978-3-540-76918-7&lt;br /&gt;
* [[Alexander Schrijver]]: &amp;#039;&amp;#039;Combinatorial Optimization: Polyhedra and Efficiency&amp;#039;&amp;#039;, Springer-Verlag, 2003, ISBN 3-540-44389-4&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Netzwerktheorie]]&lt;br /&gt;
[[Kategorie:Algorithmus]]&lt;br /&gt;
[[Kategorie:Algorithmus (Graphentheorie)]]&lt;br /&gt;
[[Kategorie:Optimierungsalgorithmus]]&lt;/div&gt;</summary>
		<author><name>89.1.213.130</name></author>
	</entry>
</feed>