diff options
| -rw-r--r-- | datastructures/RMQ.cpp | 2 | ||||
| -rw-r--r-- | graph/articulationPoints.cpp | 5 | ||||
| -rw-r--r-- | sonstiges/sonstiges.tex | 40 | ||||
| -rw-r--r-- | tcr.pdf | bin | 215205 -> 215273 bytes |
4 files changed, 36 insertions, 11 deletions
diff --git a/datastructures/RMQ.cpp b/datastructures/RMQ.cpp index 899db15..9047b33 100644 --- a/datastructures/RMQ.cpp +++ b/datastructures/RMQ.cpp @@ -12,7 +12,7 @@ void initRMQ() { } } } -//returns index of minimum! [a, b) +//returns index of minimum! [l, r) int queryRMQ(int l, int r) { if(l >= r) return l; int s = floor(log2(r-l)); r = r - (1 << s); diff --git a/graph/articulationPoints.cpp b/graph/articulationPoints.cpp index b99a286..436c59c 100644 --- a/graph/articulationPoints.cpp +++ b/graph/articulationPoints.cpp @@ -17,8 +17,9 @@ void visit(int v, int parent) { maxlow = low[*vit]; } - if (low[*vit] > d[v]) { //nur fuer Bruecken - bridges[v].push_back(*vit); bridges[*vit].push_back(v); + if (low[*vit] > d[v]) { //nur fuer Bruecken, evtl. parent betrachten! + bridges[v].push_back(*vit); + bridges[*vit].push_back(v); } low[v] = min(low[v], low[*vit]); diff --git a/sonstiges/sonstiges.tex b/sonstiges/sonstiges.tex index 694aaf7..64bc206 100644 --- a/sonstiges/sonstiges.tex +++ b/sonstiges/sonstiges.tex @@ -26,24 +26,48 @@ Wenn die Eingabe aus einem kleinen Intervall $\left[0, n\right)$ stammt ist Buck \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) + \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{sonstiges/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$. + \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{sonstiges/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}[itemsep=5mm] - \item \emph{\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 Für ein 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 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 + \item \emph{\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 Für ein 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 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} \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 Allgemeiner Graph: Das Komplement eines Vertex-Cover ist ein Independent Set. $\Rightarrow$ Max Weight Independent Set ist Komplement von Min Weight Vertex Cover. - \item Bipartiter Graph: Min Cover (kleinste Menge Knoten, die alle Kanten berühren) = Max Matching. - \item 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}) + \item Allgemeiner Graph: + Das Komplement eines Vertex-Cover ist ein Independent Set. + $\Rightarrow$ Max Weight Independent Set ist Komplement von Min Weight Vertex Cover. + \item Bipartiter Graph: + Min Vertex Cover (kleinste Menge Kanten, die alle Knoten berühren) = Max Matching. + \item 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}) + \item \textbf{Tobi, cool down!} \end{itemize} Binary files differ |
