1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
\section{Graphen}
\subsection{Minimale Spannbäume}
Benutze Algorithmus von \textsc{Kruskal} oder Algorithmus von \textsc{Prim}.
\begin{description}
\item[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.)
\item[Kreiseigenschaft] Für jeden Kreis $K$ im Graphen gilt: Die schwerste Kante auf dem Kreis ist nicht Teil des minimalen Spannbaums.
\end{description}
\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}
Alle kürzesten Pfade im Graphen.
\lstinputlisting{graph/floydWarshall.cpp}
\subsection{Strongly Connected Components (\textsc{Tarjans}-Algorithmus)}
\lstinputlisting{graph/scc.cpp}
\subsection{Artikulationspunkte und Brücken}
\lstinputlisting{graph/articulationPoints.cpp}
\subsection{Eulertouren}
\begin{itemize}
\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.
\end{itemize}
\begin{figure}[h]
\begin{lstlisting}
VISIT(v):
forall e=(v,w) in E
delete e from E
VISIT(w)
print e
\end{lstlisting}
\caption{Idee für Eulerzyklen}
\end{figure}
\lstinputlisting{graph/euler.cpp}
\subsection{Lowest Common Ancestor}
\lstinputlisting{graph/LCA.cpp}
\subsection{Max-Flow (\textsc{Edmonds-Karp}-Algorithmus)}
\lstinputlisting{graph/edmondsKarp.cpp}
\subsubsection{Maximum Edge Disjoint Paths}
Finde die maximale Anzahl Pfade von $s$ nach $t$, die keine Kante teilen.
\begin{enumerate}
\item Setze $s$ als Quelle, $t$ als Senke und die Kapazität jeder Kante auf 1.
\item Der maximale Fluss entspricht der unterschiedlichen Pfade ohne gemeinsame Kanten.
\end{enumerate}
\subsubsection{Maximum Independent Paths}
Finde die maximale Anzahl Pfade von $s$ nach $t$, die keinen Knoten teilen.
\begin{enumerate}
\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 der unterschiedlichen Pfade ohne gemeinsame Knoten.
\end{enumerate}
\subsection{Maximal Cardinatlity Bipartite Mathcing}
\lstinputlisting{graph/maxCarBiMatch.cpp}
|