\section{Graphen}

\subsection{Minimale Spannbäume}

\paragraph{Schnitteigenschaft}
Für jeden Schnitt $C$ im Graphen gilt:
Gibt es eine Kante $e$, die echt leichter ist als alle anderen Schnittkanten, so gehört diese zu allen minimalen Spannbäumen.
($\Rightarrow$ Die leichteste Kante in einem Schnitt kann in einem minimalen Spannbaum verwendet werden.)

\paragraph{Kreiseigenschaft}
Für jeden Kreis $K$ im Graphen gilt:
Die schwerste Kante auf dem Kreis ist nicht Teil des minimalen Spannbaums.

\subsection{Kürzeste Wege}

\subsubsection{Algorithmus von \textsc{Dijkstra}}
Kürzeste Pfade in Graphen ohne negative Kanten.
\lstinputlisting{graph/dijkstra.cpp}

\subsubsection{\textsc{Bellmann-Ford}-Algorithmus}
Kürzestes Pfade in Graphen mit negativen Kanten.
Erkennt negative Zyklen.
\lstinputlisting{graph/bellmannFord.cpp}

\subsubsection{\textsc{Floyd-Warshall}-Algorithmus}
\lstinputlisting{graph/floydWarshall.cpp}
\begin{itemize}[nosep]
	\item Nur negative Werte sollten die Nullen überschreiben.
	\item Von parallelen Kanten sollte nur die günstigste gespeichert werden.
	\item \lstinline{i} liegt genau dann auf einem negativen Kreis, wenn \lstinline{dist[i][i] < 0} ist.
	\item Wenn für \lstinline{c} gilt, dass \lstinline{dist[u][c] != INF && dist[c][v] != INF && dist[c][c] < 0}, wird der u-v-Pfad beliebig kurz.
\end{itemize}

\subsection{Strongly Connected Components (\textsc{Tarjans}-Algorithmus)}
\lstinputlisting{graph/scc.cpp}

\subsection{Artikulationspunkte und Brücken}
\lstinputlisting{graph/articulationPoints.cpp}

\subsection{Eulertouren}
\begin{itemize}[nosep]
	\item Zyklus existiert, wenn jeder Knoten geraden Grad hat (ungerichtet), bzw. bei jedem Knoten Ein- und Ausgangsgrad übereinstimmen (gerichtet).
	\item Pfad existiert, wenn alle bis auf (maximal) zwei Knoten geraden Grad haben (ungerichtet), bzw. bei allen Knoten bis auf zwei Ein- und Ausgangsgrad übereinstimmen, wobei einer eine Ausgangskante mehr hat (Startknoten) und einer eine Eingangskante mehr hat (Endknoten).
	\item \textbf{Je nach Aufgabenstellung überprüfen, wie isolierte Punkte interpretiert werden sollen.}
	\item Der Code unten läuft in Linearzeit.
	Wenn das nicht notwenidg ist (oder bestimmte Sortierungen verlangt werden), gehts mit einem \lstinline{set} einfacher.
	\item Algorithmus schlägt nicht fehl, falls kein Eulerzyklus existiert.
	Die Existenz muss separat geprüft werden.
\end{itemize}
\begin{lstlisting}
VISIT(v):
	forall e=(v,w) in E
	delete e from E
	VISIT(w)
	print e
\end{lstlisting}
\lstinputlisting{graph/euler.cpp}

\subsection{Lowest Common Ancestor}
\lstinputlisting{graph/LCA.cpp}

\subsection{Max-Flow}

\subsubsection{Capacity Scaling}
Gut bei dünn besetzten Graphen.
\lstinputlisting{graph/capacityScaling.cpp}

\subsubsection{Push Relabel}
Gut bei sehr dicht besetzten Graphen.
\lstinputlisting{graph/pushRelabel.cpp}

\subsubsection{Dinic's Algorithm mit Capacity Scaling}
Nochmal ca. Faktor 2 schneller als Ford Fulkerson mit Capacity Scaling.
\lstinputlisting{graph/dinicScaling.cpp}

\subsubsection{Anwendungen}
\begin{itemize}[nosep]
	\item \textbf{Maximum Edge Disjoint Paths}\newline
	Finde die maximale Anzahl Pfade von $s$ nach $t$, die keine Kante teilen.
	\begin{enumerate}[nosep]
		\item Setze $s$ als Quelle, $t$ als Senke und die Kapazität jeder Kante auf 1.
		\item Der maximale Fluss entspricht den unterschiedlichen Pfaden ohne gemeinsame Kanten.
	\end{enumerate}
	\item \textbf{Maximum Independent Paths}\newline
	Finde die maximale Anzahl an Pfaden von $s$ nach $t$, die keinen Knoten teilen.
	\begin{enumerate}[nosep]
		\item Setze $s$ als Quelle, $t$ als Senke und die Kapazität jeder Kante \emph{und jedes Knotens} auf 1.
		\item Der maximale Fluss entspricht den unterschiedlichen Pfaden ohne gemeinsame Knoten.
	\end{enumerate}
	\item \textbf{Min-Cut}\newline
	Der maximale Fluss ist gleich dem minimalen Schnitt.
	Bei Quelle $s$ und Senke $t$, partitioniere in $S$ und $T$.
	Zu $S$ gehören alle Knoten, die im Residualgraphen von $s$ aus erreichbar sind (Rückwärtskanten beachten).
\end{itemize}

\subsection{Min-Cost-Max-Flow}
\lstinputlisting{graph/minCostMaxFlow.cpp}

\subsection{Maximal Cardinatlity Bipartite Matching}\label{kuhn}
\lstinputlisting{graph/maxCarBiMatch.cpp}
\lstinputlisting{graph/hopcroftKarp.cpp}

\subsection{2-SAT}
\lstinputlisting{graph/2sat.cpp}

% \subsection{TSP}
% \lstinputlisting{graph/TSP.cpp}

\subsection{Bitonic TSP}
\lstinputlisting{graph/bitonicTSP.cpp}

