\setcounter{subsection}{3}
\subsection{Connectivity}
\setcounter{all}{23}
% Page 37
\begin{definition}[]{$k$-Connected graph}
    A graph $G = (V, E)$ is called $k$\textit{-connected} if $|V| \geq k + 1$ and for all subsets $X \subseteq V$ with $|X| < k$ we have that the graph $G[V\backslash X]$ is connected
\end{definition}
If $G[V\backslash X]$ is \bi{not} connected, we call it a \textit{(vertex)-separator}.

A $k$-connected graph is also $k - 1$ connected, etc

\begin{definition}[]{$k$-edge-connected}
    A graph $G = (V, E)$ is called $k$\textit{-edge-connected} if for all subsets $X \subseteq E$ with $|X| < k$ we have: The graph $(V, E\backslash X)$ is connected
\end{definition}
We also have \textit{edge-separators}, defined analogously to above, i.e. the set $X$ above is called a $u$-$v$-edge-separator if by removing it from the graph, $u$ and $v$ no longer lay in the same connected component.

If a graph is $k$-edge-connected, it is also $k - 1$-edge-connected, etc


\begin{theorem}[]{Menger's theorem}
    Let $G = (V, E)$ be a graph and $u \neq v \in V$. Then we have
    \begin{enumerate}
        \item Every $u$-$v$-vertex-separator has size at least $k \Leftrightarrow$ Exist at least $k$ internally vertex-disjoint $u$-$v$-paths
        \item Every $u$-$v$-edge-separator has size at least $k \Leftrightarrow$ Exist at least $k$ edge-disjoint $u$-$v$-paths
    \end{enumerate}
\end{theorem}


\newpage
\subsubsection{Articulation points}
If a graph is connected, but not $2$-connected, there exists at least one vertex $v$ for which, if removed, the graph is not connected, called \textit{articulation points}. Using a modified DFS, we can find these vertices. Instead of just setting a flag for each vertex we visit, we set a number indicating the order in which the vertices were visited. The first vertex we visit, for instance, gets number $1$.

We also add another value, which we call \verb|low[v]| $:=$ the smallest DFS-number that can be reached from $v$ using a path of arbitrarily many edges of the DFS-tree and at most one residual edge.

We also have (where $s$ is the start / source vertex and $E(T)$ is the edge set of the DFS-tree):

$v$ is an articulation point $\Leftrightarrow$ ($v = s$ and $s$ has degree at least $2$ in $T$) or ($v \neq s$ and there exists $w \in V$ with $\{(v, w)\} \in E(T)$ and $\verb|low[w]| \geq \verb|dfs[v]|$)


\begin{algorithm}
    \caption{\textsc{FindArticulationPoints}($G, s$)}
    \begin{algorithmic}[1]
        \State $\forall v \in V$: \texttt{dfs[v]}$\gets 0$ \Comment{Stores dfs number for vertex $v$ and also flag for visit}
        \State $\forall v \in V$: \texttt{low[v]}$\gets 0$ \Comment{Stores low point for vertex $v$}
        \State $\forall v \in V$: \texttt{isArticulationPoint[v]}$\gets \texttt{false}$ \Comment{Indicates if vertex $v$ is articulation point}
        \State \texttt{num} $\gets 0$
        \State $T \gets \emptyset$ \Comment{Depth-First-Search Tree}
        \State \Call{DFS-Visit}{$G, s$}
        \If{$s$ has degree at least two in $T$} \Comment{Start vertex classification could be incorrect from \textsc{DFS-Visit}}
            \State $\texttt{isArticulationPoint[s]} \gets \texttt{true}$
        \Else
            \State $\texttt{isArticulationPoint[s]} \gets \texttt{false}$
        \EndIf
        \Procedure{DFS-Visit}{$G, v$}
            \State \texttt{num} $\gets$ \texttt{num} $+ 1$
            \State \texttt{dfs[v]} $\gets$ \texttt{num}
            \State \texttt{low[v]} $\gets$ \texttt{dfs[v]}
            \For{\textbf{all} $\{v, w\} \in E$}
                \If{\texttt{dfs[w]} = 0}
                    \State $T \gets T \cup \{\{v, w\}\}$
                    \State $\texttt{val} \gets$ \Call{DFS-Visit}{$G, w$}
                    \If{$\texttt{val} \geq \texttt{dfs[v]}$} \Comment{Check articulation point condition}
                        \State $\texttt{isArticulationPoint[v]} \gets \texttt{true}$
                    \EndIf
                    \State $\texttt{low[v]} \gets \min \{\texttt{low[v]}, \texttt{val}\}$
                \ElsIf{$\texttt{dfs[w]} \neq 0$ \textbf{and} $\{v, w\} \notin T$} \Comment{Update low if already visited}
                    \State $\texttt{low[v]} \gets \min \{\texttt{low[v]}, \texttt{dfs[w]}\}$
                \EndIf
            \EndFor
            \State \Return \texttt{low[v]}
        \EndProcedure
    \end{algorithmic}
\end{algorithm}

\stepcounter{all}
\begin{theorem}[]{Articulation points Computation}
    For a connected graph $G = (V, E)$ that is stored using an adjacency list, we can compute all articulation points in \tco{|E|}
\end{theorem}


\newpage
\subsubsection{Bridges}
While articulation points show that a graph is not $2$-connected, bridges shows that a graph isn't $2$-edge-connected.
In other words, they are certificates for the graph \textit{not} being $2$-edge-connected or more formally:

\begin{center}
    \fbox{
        \textit{
            An edge $e \in E$ in a connected graph $G = (V, E)$ is called a bridge if the graph $(V, E\backslash \{e\})$ is not connected.
        }
    }
\end{center}

From the definition of bridges we immediately have that a spanning tree has to contain all bridges of a graph, and we can also state that only edges of a Depth-First-Search-Tree are possible candidates for a bridge.

The idea now is that every vertex contained in a bridge is either an articulation point or has degree $1$ in $G$. Or more formally:

\begin{center}
    \fbox{
        \textit{
            A directed edge $(v, w)$ of Depth-First-Search-Tree $T$ is a bridge if and only if $\texttt{low[w]} > \texttt{dfs[v]}$
        }
    }
\end{center}

\begin{theorem}[]{Bridges Computation}
    For a connected graph $G = (V, E)$ that is stored using an adjacency list, we can compute all bridges and articulation points in \tco{|E|}
\end{theorem}

\subsubsection{Block-Decomposition}
\begin{definition}[]{Block-Decomposition}
    Let $G = (V, E)$ be a connected graph. For $e, f \in E$ we define a relation by
    \begin{align*}
        e \sim f \Longleftrightarrow e = f \text{ or exists a common cycle through $e$ and } f
    \end{align*}
    Then this relation is an equivalence relation and we call the equivalence classes \textit{blocks}, sometimes also known as $2$-connectivity-components
\end{definition}
It is now evident that two blocks, if even, can only intersect in one articulation point.
The Block-Decomposition is given by:
\begin{center}
    \fbox{
        \parbox{15cm}{
            Let $T$ be a bipartite graph (in this case a tree), with $V = A \uplus B$ where $A$ is the set of articulation points of $G$ and $B$ the set of blocks of $G$ (This means that every block in $G$ is a vertex in $V$).

            We connect a vertex $a \in A$ with a block $b \in B$ if and only if $a$ is incident to an edge in $b$.

            $T$ is connected if $G$ is and it is free of cycles if $G$ is free of cycles, since every cycle is translatable to a cycle in $G$
        }
    }
\end{center}
The algorithm to determine bridges and articulation points can again be reused and allows us to determine a Block-Decomposition in linear time.
