\documentclass{article}

\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}

\usepackage[utf8]{inputenc}

\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother

\title{FOP Projektgruppe 175}
\author{Steffen Wagner\\
	Dennis Weinberger\\
	Jonas Süß\\
	Joachim Schmidt}

\begin{document}
	\maketitle
	
	\tableofcontents

	\section{Der Graph}

	\subsection{Bildung der Kanten}

	Der Algorithmus für die Bildung der Kanten ist folgender:

	\begin{algorithm}
		\caption{Bildung von Kanten}\label{euclid}
		\begin{algorithmic}[1]
		\Procedure{generateEdges}{}
		\State $\textit{firstNode} \gets \text{first element of }\textit{nodes}$
		\State $allVisitedNodes \gets \textit{empty}$
		\State $nextVisitNodes \gets empty$
		\State $\text{append } firstNode \text{ to } allVisitedNodes$
		\State $\text{neighborsOf } firstNode$
		\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
		\State $\rightarrow \text{append to } nextVisitNodes$
		\BState \emph{loop}
		\If {$nextVisitNodes \text{ is empty}$}
		break
		\EndIf
		\State $\text{neighborsOf first element of } nextVisitNodes$
		\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
		\State $\rightarrow \text{append to } nextVisitNodes$
		\State $\text{append first element of } nextVisitNodes \text{ to } allVisitedNodes$
		\State $\text{delete first element of } nextVisitNodes$
		\BState \emph{end loop}
		\EndProcedure
		\end{algorithmic}
	\end{algorithm}

	\subsection{Überprüfung der Erreichbarkeit aller Knoten}

	Der Algorithmus, der prüft, ob alle Knoten erreichbar sind, ist
	folgender:

	\begin{algorithm}
		\caption{Erreichbarkeit aller Knoten}\label{euclid}
		\begin{algorithmic}[1]
		\Procedure{allNodesConnected}{}
		\State $\textit{firstNode} \gets \text{first element of }\textit{nodes}$
		\State $allVisitedNodes \gets \textit{empty}$
		\State $nextVisitNodes \gets empty$
		\State $\text{append } firstNode \text{ to } allVisitedNodes$
		\State $\text{neighborsOf } firstNode$
		\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
		\State $\rightarrow \text{append to } nextVisitNodes$
		\BState \emph{loop}
		\If {$nextVisitNodes \text{ is empty}$}
		break
		\EndIf
		\State $\text{append first element of } nextVisitNodes \text{ to } allVisitedNodes$
		\State $\text{neighborsOf first element of } nextVisitNodes$
		\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
		\State $\rightarrow \text{append to } nextVisitNodes$
		\State $\text{delete first element of } nextVisitNodes$
		\BState \emph{end loop}
		\EndProcedure
		\end{algorithmic}
	\end{algorithm}

	Der Algorithmus sammelt sozusagen alle Knoten, die 
	aufgrund von momentanen Erkenntnissen erreichbar
	sind, in der Liste \texttt{nextVisitNodes}. Hingegen sind
	alle Knoten, die schon erreicht worden sind, in der Liste
	\texttt{allVisitedNodes} gespeichert. 
	
	Der Algorithmus geht die Liste \texttt{nextVisitNodes}
	solange durch, bis diese leer ist. In jeder Iteration wird
	das erste Element der Liste aus der Liste entfernt. 
	Zunächst wird dieses Element der Liste \texttt{allVisitedNodes} 
	hinzugefügt. Daraufhin
	werden die Nachbarn dieses Elements herausgefunden. Diejenigen
	Nachbarn, die schon in der Liste \texttt{allVisitedNodes}
	vorhanden sind, werden verworfen. Die restlichen Nachbarn
	werden der Liste \texttt{nextVisitNodes} hinzugefügt.
    
\end{document}
