übungsblatt 2
This commit is contained in:
parent
c9d7939233
commit
3c93339506
19 changed files with 2055 additions and 50 deletions
78
übung_2/aufgabe_2.tex
Normal file
78
übung_2/aufgabe_2.tex
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
\section{Kreissuche}
|
||||
\begin{tasks}
|
||||
\item
|
||||
Wähle Startknoten $s$ und füge ihn in eine neue Queue $Q$ ein.
|
||||
|
||||
Nimm den vordersten Knoten $u$ aus $Q$ und füge seine noch nicht entdeckten (weißen)
|
||||
Nachbarn ein und färbe sie grau. Wenn einer der Nachbarn schon entdeckt wurde,
|
||||
also grau ist, gibt es einen Kreis in $G$.
|
||||
Markiere den Knoten $u$ als abgeschlossen ($black$) und entferne ihn aus $Q$
|
||||
|
||||
Wiederhole den Schritt solange bis $Q$ leer ist.
|
||||
|
||||
% \begin{pseudocode}[caption=Hello World Algorithmische]
|
||||
% EinfacherKreis(|Graph| $G$, |Vertex| $s$)
|
||||
% Initialize($G$, $s$)
|
||||
% $Q \gets$ new Queue
|
||||
% $Q.$Enqueue($s$)
|
||||
% $t_1 \gets nil$
|
||||
% $t_2 \gets s$
|
||||
% // Comment
|
||||
% while $Q \neq \emptyset$ do
|
||||
% $u \gets Q.$Dequeue
|
||||
% $t_1 \gets t_2$
|
||||
% $t_2 \gets u$
|
||||
% foreach $v \in Adj[u]$ do
|
||||
% if $v.color = white$ then
|
||||
% $Q.$Enqueue($v$)
|
||||
% $u.color \gets black$
|
||||
% if $t_1 = t_2$ then
|
||||
% return $true$
|
||||
% else
|
||||
% return $false$
|
||||
% \end{pseudocode}
|
||||
\begin{algorithm}[h]
|
||||
\centering
|
||||
\begin{algorithmic}
|
||||
\alg{EinfacherKreis}{Graph $G$, Vertex $s$} \+ \\
|
||||
\alg{Initialize}{$G$, $s$} \com{So wie in der Breitensuche} \\
|
||||
$Q \gets$ new \alg{Queue}{} \\
|
||||
$Q.$\alg{Enqueue}{$s$} \\
|
||||
while $Q \neq \emptyset$ do \+ \\
|
||||
$u \gets Q.$\alg{Dequeue}{} \\
|
||||
$u.color \gets gray$ \\
|
||||
foreach $v \in Adj[u]$ do \+ \\
|
||||
\com{Füge alle noch nicht entdeckten Knoten ein} \\
|
||||
if $v.color = white$ then \+ \\
|
||||
$v.color \gets gray$ \\
|
||||
$Q.$\alg{Enqueue}{$v$} \- \\
|
||||
\com{Wenn ein Knoten schon entdeckt wurde, gibt es einen Kreis} \\
|
||||
else return $true$ \- \\
|
||||
$u.color \gets black$ \- \\
|
||||
return $false$
|
||||
\end{algorithmic}
|
||||
\end{algorithm}
|
||||
\points{4}
|
||||
|
||||
\item
|
||||
Dadurch, dass wir nur Knoten
|
||||
einfügen, die noch nicht entdeckt wurden, können wir nie auf dem selben Pfad
|
||||
zu einem Knoten kommen. Das heißt, wenn wir einen schon entdeckten Knoten
|
||||
finden, haben wir einen Kreis im Graphen gefunden.
|
||||
|
||||
Der Algorithmus kann aufgrund der Struktur des Graphens (kein Multigraph,
|
||||
keine Selbstkanten) nur Kreise der Länge mindestens 3 finden.
|
||||
|
||||
Jeder Knoten wird nur einmal in die Queue eingefügt und nur einmal herausgenommen.
|
||||
Somit läuft der Algorithmus in $\Oh(\abs{V})$.
|
||||
\points{2}
|
||||
|
||||
\item
|
||||
Solange es weiße Knoten im Graphen gibt, wählen wir einen neuen Startknoten
|
||||
für diese Zusammenhangskomponente. Als Ausgabe geben wir ein Array von
|
||||
Tupeln $\tup{s_i, c_i}$ zurück, wobei $s_i$ der Startknoten einer
|
||||
Zusammenhangskomponente und $c_i \in \set{true, false}$ der Wahrheitswert, ob
|
||||
ein Kreis in der Komponente existiert.
|
||||
\points{1}
|
||||
\end{tasks}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue