aufgabe 2

This commit is contained in:
Never Gude 2026-05-30 23:59:28 +02:00
parent 6475d1b263
commit 7e1f3b4d0f
7 changed files with 986 additions and 123 deletions

View file

@ -1,82 +1,6 @@
\newcommand{\OPT}{\mathrm{OPT}}
\section{Paarungen (Matchings) in Bäumen}
\section{LP-Runden}
\begin{tasks}
\item
\label{1a}
Ein Baum ist ein kreisfreier, zusammenhängender Graph. Ein Baum besitzt ein
perfektes Matching genau dann, wenn die Anzahl der Knoten gerade ist und
jedes Blatt keine Geschwisterknoten hat.
Die Anzahl der Knoten muss gerade sein, da in einem perfekten Match\-ing jeder
Knoten mit einem anderen gematcht wird.
Jedes Blatt muss Einzelblatt sein, da der Elternknoten nur mit einem Blatt
gematcht werden kann.
Also ist ein perfektes Matching im Baum eindeutig, da jedes Blatt mit seinem
Elternknoten gematcht werden muss. Diese Kante $uv$ ist sicher im Matching enthalten und alle zu $u$ oder $v$ inzidenten Kanten können aus dem Baum gelöscht werden. So entsteht ein neues Blatt, für das
die selbe Regel gilt.
\points{3}
\item
Der \autoref{alg:treematching} berechnet ein größtes Matching.
Der Algorithmus ist korrekt, da der Baum $T$ entweder ein perfektes Matching
enthält und somit ein perfektes Matching berechnet (Siehe \autoref{1a}),
oder I dont fucking know.
Die Laufzeit für \algt{Initialize} liegt in $\Oh(V)$, da sich der Baum in linearer Zeit augmentieren lässt und es $\abs{V} - 1$ viele Kanten gibt.
Die Laufzeit für \algt{MatchaTeeRec} liegt in $\Oh(V)$. Der Algorithmus wird genau
einmal für jeden Knoten aufgerufen. Wenn eine Kante zum
Match\-ing hinzugefügt wird, werden die Knoten und Kanten aus dem Baum gelöscht
die nicht mehr zum Matching hinzugefügt werden können und somit
nicht mehr bearbeitet werden.
Also liegt auch \algt{MatchaTee} in $\Oh(V)$.
\begin{algorithm}
\centering
\caption{Größtes Matching in Bäumen}
\label{alg:treematching}
\begin{algorithmic}
\alg{MatchaTee}{$T = \tup{V, E}$} \+ \\
\com{Den ungerichten Baum zu einem gerichteten Baum mit $parent$ und} \\
\com{$children$ pro Knoten und einer Wurzel $root$ augmentieren.} \\
\alg{Initialize}{$T$} \\
return \alg{MatchaTeeRec}{$T$, $T.root$} \- \\
\\
\alg{MatchaTeeRec}{$T$, $r$} \+ \\
\com{Rekursiv für die Kinder aufrufen} \\
$m \gets \emptyset$ \\
foreach $v \in r.children$ do \+ \\
$m \gets m \cup \text{\alg{MatchaTeeRec}{T, v}}$ \- \\
\com{Wenn Knoten Blatt ist, dann die Kante zum Elternknoten hinzufügen.} \\
if $r \neq nil$ and $deg(r) = 1$ then \+ \\
\com{Die Knoten und inzidente Kanten aus dem Baum entfernen.} \\
$T \gets T \setminus \set{r.parent, r.parent.children}$ \\
$m \gets m \cup \set{\set{r, r.parent}}$ \- \\
return $m$
\end{algorithmic}
\end{algorithm}
\points{5}
\item
Wenn eine Kante $rv$ zu einem Matching hinzugefügt wird, kann keine zu $v$
inzidente Kante hinzugefügt werden. Das müssen wir auch bei unserem dynamischen
Programm beachten.
\[
\OPT(r) = \max_{v \in r.children}
\begin{cases}
rv + \sum_{i \in v.children} \OPT(i) + \sum_{j \in r.children \setminus v} \OPT(j) \\
\sum_{k \in r.children} \OPT(k)
\end{cases}
\]
Der Algorithmus hält sich an die Eigenschaften eines Matchings, also ist
er korrekt.
Der Algorithmus probiert alle Kindknoten von $r$ aus. Geht man mit $r$ im Baum von
unten nach oben sind das also höchstens so viele Iterationen wie, Knoten im Baum
existieren (ohne die Blätter). Also läuft das Dynamische Programm in $\Oh(V)$.
\points{5}
\item
\item
\item
\end{tasks}