Files
eth-summaries/algorithms-and-datastructures/parts/graphs/bfs-dfs.tex

114 lines
4.4 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\newpage
\subsection{Topological Sorting / Ordering}
\begin{definition}[]{Topological Ordering}
A \textbf{topological ordering} of a directed acyclic graph (DAG) $G = (V, E)$ is a linear ordering of its vertices such that for every directed edge $(u, v) \in E$, vertex $u$ comes before vertex $v$ in the ordering.
\end{definition}
\begin{properties}[]{Topological Ordering}
\begin{itemize}
\item A graph has a topological ordering if and only if it is a DAG.
\item The ordering is not unique if the graph contains multiple valid sequences of vertices.
\item Common algorithms to compute topological ordering:
\begin{itemize}
\item \textbf{DFS-based Approach:} Perform a depth-first search and record vertices in reverse postorder.
\item \textbf{Kahns Algorithm:} Iteratively remove vertices with no incoming edges while maintaining order.
\end{itemize}
\end{itemize}
\end{properties}
\newpage
\subsection{Graph search}
\subsubsection{DFS}
\begin{definition}[]{Depth-First Search (DFS)}
\textbf{Depth-First Search} is an algorithm for traversing or searching a graph by exploring as far as possible along each branch before backtracking.
\end{definition}
\begin{algorithm}
\caption{Depth-First Search (Recursive)}
\begin{algorithmic}[1]
\Procedure{DFS}{$v$}
\State \textbf{Mark} $v$ as visited
\For{each neighbor $u$ of $v$}
\If{$u$ is not visited}
\State \Call{DFS}{$u$}
\EndIf
\EndFor
\EndProcedure
\end{algorithmic}
\end{algorithm}
\begin{properties}[]{Depth-First Search}
\begin{itemize}
\item Can be implemented recursively or iteratively (using a stack).
\item Time complexity: \tco{|V| + |E|}, where $|V|$ is the number of vertices and $|E|$ is the number of edges.
\item Used for:
\begin{itemize}
\item Detecting cycles in directed and undirected graphs.
\item Finding connected components in undirected graphs.
\item Computing topological ordering in a DAG.
\end{itemize}
\end{itemize}
\end{properties}
\subsubsection{BFS}
\begin{definition}[]{Breadth-First Search (BFS)}
\textbf{Breadth-First Search} is an algorithm for traversing or searching a graph by exploring all neighbors of a vertex before moving to the next level of neighbors.
\end{definition}
\begin{algorithm}
\caption{Breadth-First Search (Iterative)}
\begin{algorithmic}[1]
\Procedure{BFS}{$start$}
\State \textbf{Initialize} queue $Q$ and mark $start$ as visited
\State \textbf{Enqueue} $start$ into $Q$
\While{$Q$ is not empty}
\State $v \gets \textbf{Dequeue}(Q)$
\For{each neighbor $u$ of $v$}
\If{$u$ is not visited}
\State \textbf{Mark} $u$ as visited
\State \textbf{Enqueue} $u$ into $Q$
\EndIf
\EndFor
\EndWhile
\EndProcedure
\end{algorithmic}
\end{algorithm}
\begin{properties}[]{Breadth-First Search}
\begin{itemize}
\item Implements a queue-based approach for level-order traversal.
\item Time complexity: \tco{|V| + |E|}.
\item Used for:
\begin{itemize}
\item Finding shortest paths in unweighted graphs.
\item Checking bipartiteness.
\end{itemize}
\end{itemize}
\end{properties}
\begin{example}[]{DFS and BFS Traversal}
\begin{center}
\begin{tikzpicture}[node distance=1.5cm, main/.style={circle, draw, fill=blue!20, minimum size=10mm, inner sep=0pt}]
% Graph vertices
\node[main] (1) {1};
\node[main] (2) [above right of=1] {2};
\node[main] (3) [below right of=1] {3};
\node[main] (4) [right of=2] {4};
\node[main] (5) [right of=3] {5};
% Edges
\draw (1) -- (2);
\draw (1) -- (3);
\draw (2) -- (4);
\draw (3) -- (5);
\draw (4) -- (5);
\end{tikzpicture}
\end{center}
\textbf{DFS Traversal:} Starting at $1$, a possible traversal is $1 \to 2 \to 4 \to 5 \to 3$.\\
\textbf{BFS Traversal:} Starting at $1$, a possible traversal is $1 \to 2 \to 3 \to 4 \to 5$.
\end{example}