\section{Applications}


\problem{Maximum Cardinality Matching}

A \textit{matching} is a subset of edges in a bipartite graph. Nodes in a matching must not have more than one edge connected to them. \\
A matching is \textit{maximal} if it has more edges than any other matching.

\vspace{5mm}

\begin{minipage}[t]{0.48\textwidth}
\begin{center}
	Initial Graph \\
	\vspace{2mm}
	\begin{tikzpicture}
		% Nodes
		\begin{scope}[layer = nodes]
			\node[main] (A1) at (0mm, 24mm) {};
			\node[main] (A2) at (0mm, 18mm) {};
			\node[main] (A3) at (0mm, 12mm) {};
			\node[main] (A4) at (0mm, 6mm) {};
			\node[main] (A5) at (0mm, 0mm) {};
			\node[main] (B1) at (20mm, 24mm) {};
			\node[main] (B2) at (20mm, 18mm) {};
			\node[main] (B3) at (20mm, 12mm) {};
			\node[main] (B4) at (20mm, 6mm) {};
			\node[main] (B5) at (20mm, 0mm) {};
		\end{scope}

		% Edges
		\draw
			(A1) edge (B2)
			(A1) edge (B3)
			(A2) edge (B1)
			(A2) edge (B4)
			(A4) edge (B3)
			(A2) edge (B3)
			(A5) edge (B3)
			(A5) edge (B4)
		;

	\end{tikzpicture}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
	Maximal Matching \\
	\vspace{2mm}
	\begin{tikzpicture}
		% Nodes
		\begin{scope}[layer = nodes]
			\node[main] (A1) at (0mm, 24mm) {};
			\node[main] (A2) at (0mm, 18mm) {};
			\node[main] (A3) at (0mm, 12mm) {};
			\node[main] (A4) at (0mm, 6mm) {};
			\node[main] (A5) at (0mm, 0mm) {};
			\node[main] (B1) at (20mm, 24mm) {};
			\node[main] (B2) at (20mm, 18mm) {};
			\node[main] (B3) at (20mm, 12mm) {};
			\node[main] (B4) at (20mm, 6mm) {};
			\node[main] (B5) at (20mm, 0mm) {};
		\end{scope}

		% Edges
		\draw[opacity = 0.4]
			(A1) edge (B2)
			(A1) edge (B3)
			(A2) edge (B1)
			(A2) edge (B4)
			(A4) edge (B3)
			(A4) edge (B3)
			(A5) edge (B3)
			(A5) edge (B4)
		;
		\draw
			(A1) edge (B2)
			(A2) edge (B1)
			(A4) edge (B3)
			(A5) edge (B4)
		;
	\end{tikzpicture}
\end{center}
\end{minipage}

\vspace{5mm}

Create an algorithm that finds a maximal matching in any bipartite graph. \\
Find an upper bound for its runtime. \\
\hint{Can you modify an algorithm we already know?}

\begin{solution}
	Turn this into a maximum flow problem and use FF. \\
	Connect a node $S$ to all nodes in the left group and a node $T$ to all nodes in the right group. All edges have capacity 1.

	\vspace{2ex}

	Just like FF, this algorithm will take at most $\min(\# \text{ left nodes}, \# \text{ right nodes})$ iterations.
\end{solution}

\vfill
\pagebreak

\problem{Supply and Demand}

Say we have a network of cities and power stations. Stations produce power; cities consume it.

Each station produces a limited amount of power, and each city has limited demand.

\vspace{2ex}

We can represent this power grid as a graph, with cities and stations as nodes and transmission lines as edges.

\vspace{2ex}

A simple example is below. There are two cities ($2$ and $4$) and two stations (both $-3$).

We'll represent station capacity with a negative number, since they \textit{consume} a negative amount of energy.

\begin{center}
	\begin{tikzpicture}[
		node distance = 25mm,
		main/.style = {
			draw,
			circle,
			fill = white,
			minimum size = 8mm
		},
	]
		% Nodes
		\begin{scope}[layer = nodes]
			\node[main] (S1) {$-3$};
			\node[main] (S2) [below left of = S1] {$-3$};
			\node[main] (C1) [below right of = S1] {$2$};
			\node[main] (C2) [below right of = S2] {$4$};
		\end{scope}

		% Edges
		\draw[->]
			(S1) edge node[label] {$3$} (S2)
			(S1) edge node[label] {$3$} (C1)
			(S2) edge node[label] {$2$} (C1)
			(S2) edge node[label] {$2$} (C2)
			(C1) edge node[label] {$2$} (C2)
		;
	\end{tikzpicture}
\end{center}

We'd like to know if there exists a \textit{feasible circulation} in this network---that is, can we supply our cities with the energy they need without exceeding the capacity of our power plants and transmission lines?

\vspace{2ex}

\textbf{Your job:} Devise an algorithm that solve this problem.

\vspace{2ex}

\note{\textbf{Bonus:} Say certain edges have a lower bound on their capacity, meaning that we must send \textit{at least} that much flow down the edge. Modify your algorithm to account for these additional constraints.}


\begin{solution}
	Create a source node $S$, and connect it to each station with an edge. Set the capacity of that edge to the capacity of the station. \\

	Create a sink node $T$ and do the same for cities.

	\vspace{2ex}

	This is now a maximum-flow problem with one source and one sink. Apply FF.

	\linehack{}

	To solve the bonus problem, we'll modify the network before running the algorithm above.

	\vspace{2ex}

	Say an edge from $A$ to $B$ has minimum capacity $l$ and maximum capacity $u \geq l$. Apply the following transformations:
	\begin{itemize}
		\item Add $l$ to the capacity of $A$
		\item Subtract $l$ from the capacity of $B$
		\item Subtract $l$ from the total capacity of the edge.
	\end{itemize}

	Do this for every edge that has a lower bound then apply the algorithm above.

\end{solution}

\vfill
\pagebreak