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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
\section{Sonstiges}
\subsection{2-SAT}
\begin{enumerate}
\item Bedingungen in 2-CNF formulieren.
\item Implikationsgraph bauen, $\left(a \vee b\right)$ wird zu $\neg a \Rightarrow b$ und $\neg b \Rightarrow a$.
\item Finde die starken Zusammenhangskomponenten.
\item Genau dann lösbar, wenn keine Variable mit ihrer Negation in einer SCC liegt.
\end{enumerate}
\subsection{Zeileneingabe}
\lstinputlisting{other/split.cpp}
\subsection{Bit Operations}
\lstinputlisting{other/bitOps.cpp}
\subsection{Josephus-Problem}
$n$ Personen im Kreis, jeder $k$-te wird erschossen.
\begin{description}
\item[Spezialfall $k=2$:] Betrachte Binärdarstellung von $n$.
Für $n = 1b_1b_2b_3..b_n$ ist $b_1b_2b_3..b_n1$ die Position des letzten Überlebenden.
(Rotiere $n$ um eine Stelle nach links)
\lstinputlisting{other/josephus2.cpp}
\item[Allgemein:] Sei $F(n,k)$ die Position des letzten Überlebenden.
Nummeriere die Personen mit $0, 1, \ldots, n-1$.
Nach Erschießen der $k$-ten Person, hat der Kreis noch Größe $n-1$ und die Position des Überlebenden ist jetzt $F(n-1,k)$.
Also: $F(n,k) = (F(n-1,k)+k)\%n$. Basisfall: $F(1,k) = 0$.
\lstinputlisting{other/josephusK.cpp}
\end{description}
\textbf{Beachte bei der Ausgabe, dass die Personen im ersten Fall von $1, \ldots, n$ nummeriert sind, im zweiten Fall von $0, \ldots, n-1$!}
\subsection{Gemischtes}
\begin{itemize}
\item \textbf{\textsc{Johnsons} Reweighting Algorithmus:}
Füge neue Quelle \lstinline{S} hinzu, mit Kanten mit Gewicht 0 zu allen Knoten.
Nutze \textsc{Bellmann-Ford} zum Betsimmen der Entfernungen \lstinline{d[i]} von \lstinline{S} zu allen anderen Knoten.
Stoppe, wenn es negative Zyklen gibt.
Sonst ändere die gewichte von allen Kanten \lstinline{(u,v)} im ursprünglichen Graphen zu \lstinline{d[u]+w[u,v]-d[v]}.
Dann sind alle Kantengewichte nichtnegativ, \textsc{Dijkstra} kann angewendet werden.
\item \textbf{System von Differenzbeschränkungen:}
Ändere alle Bedingungen in die Form $a-b \leq c$.
Für jede Bedingung füge eine Kante \lstinline{(b,a)} mit Gweicht \lstinline{c} ein.
Füge Quelle \lstinline{s} hinzu, mit Kanten zu allen Knoten mit Gewicht 0.
Nutze \textsc{Bellmann-Ford}, um die kürzesten Pfade von \lstinline{s} aus zu finden.
\lstinline{d[v]} ist mögliche Lösung für \lstinline{v}.
\item \textbf{Min-Weight-Vertex-Cover im bipartiten Graph:}
Partitioniere in \lstinline{A, B} und füge Kanten \lstinline{s -> A} mit Gewicht \lstinline{w(A)} und Kanten \lstinline{B -> t} mit Gewicht \lstinline{w(B)} hinzu.
Füge Kanten mit Kapazität $\infty$ von \lstinline{A} nach \lstinline{B} hinzu, wo im originalen Graphen Kanten waren.
Max-Flow ist die Lösung.\newline
Im Residualgraphen:
\begin{itemize}[nosep]
\item Das Vertex-Cover sind die Knoten inzident zu den Brücken. \emph{oder}
\item Die Knoten in \lstinline{A}, die \emph{nicht} von \lstinline{s} erreichber sind und die Knoten in \lstinline{B}, die von \lstinline{erreichber} sind.
\end{itemize}
\item \textbf{Allgemeiner Graph:}
Das Komplement eines Vertex-Cover ist ein Independent Set.
$\Rightarrow$ Max Weight Independent Set ist Komplement von Min Weight Vertex Cover.
\item \textbf{Bipartiter Graph:}
Min Vertex Cover (kleinste Menge Kanten, die alle Knoten berühren) = Max Matching.
\item \textbf{Bipartites Matching mit Gewichten auf linken Knoten:}
Minimiere Matchinggewicht.
Lösung: Sortiere Knoten links aufsteigend nach Gewicht, danach nutze normlen Algorithmus (\textsc{Kuhn}, Seite \pageref{kuhn})
\end{itemize}
\subsection{Sonstiges}
\begin{lstlisting}
// Alles-Header.
#include <bits/stdc++.h>
// Setzt das deutsche Tastaturlayout.
setxkbmap de
// Schnelle Ein-/Ausgabe mit cin/cout.
ios::sync_with_stdio(false);
// Set mit eigener Sortierfunktion. Typ muss nicht explizit angegeben werden.
set<point2, decltype(comp)> set1(comp);
// PI
#define PI (2*acos(0))
// STL-Debugging, Compiler flags.
-D_GLIBCXX_DEBUG
#define _GLIBCXX_DEBUG
// 128-Bit Integer. Muss zum Einlesen/Ausgeben in einen int oder long long gecastet werden.
__int128
\end{lstlisting}
|