\item Un graphe est un tuple $(V,E)$ formé de \textbf{sommets}$V$ et d'\textbf{arêtes}$E \subseteq V \times V$.
\item Une arête est représentée par une paire de sommets. Ces sommets sont \textbf{adjacents}.
\item Un graphe peut avoir des \textbf{poids} sur ses arêtes.
\item Un \textbf{chemin} est une suite de sommets distincts. Il a une \textbf{origine} et une \textbf{destination}.
\item Un \textbf{cycle} est une suite de sommets distincts dont le dernier sommet est adjacent au premier.
\item Liste de proximité: Tableau $Adj$ dont chaque élément $Adj[i]$ pointe sur une liste qui contient les sommets adjacents. Cette liste peut être doublement chaînée
\end{itemize}
\subsection{Fouille en profondeur}
\label{sec:fouilleprofondeur}
\begin{itemize}
\item Code de couleurs: Blanc=non visité, Gris=visite non complétée, Noir=visite complétée
\item Vecteur parent: Encode une forêt. $u$ est le parent de $v$ = $Parent[v]=u$
\item Complexité:
\begin{table}[!ht]
\centering
\begin{tabular}{l|l}
Étape & Complexité \\
\hline
Initialisation &$\mathcal{O}(|V|)$\\
Visite &$|V|$\\
Arête &$|E|$\\
\hline
\textbf{Total}&$\mathcal{O}(|V|+|E|)$
\end{tabular}
\caption{Complexité de la fouille en profondeur}
\label{tab:compfouilleprof}
\end{table}
\end{itemize}
\begin{algorithm}[!ht]
\Deb{
\PourTous{$u \in V$}{
$Couleur[u]\leftarrow Blanc$\;
$Parent[u]\leftarrow Nul$\;
}
\PourTous{$u \in V$}{
\Si{$Couleur[u]=Blanc$}{
Visite$(u,V,E)$\;
}
}
}
\caption{FouilleProfondeur$(V,E)$}
\end{algorithm}
\begin{algorithm}[!ht]
\Deb{
$Couleur[u]=Gris$\;
\Pour{$v \in Adj[u]$}{
\Si{$Couleur[u]=Blanc$}{
$Parent[v]\leftarrow u$\;
Visite$(v,V,E)$\;
}
}
$Couleur[u]=Noir$
}
\caption{Visite$(u,V,E)$}
\end{algorithm}
Pour trouver un chemin entre $s$ et $t$, on exécute seulement la fouille en profondeur sur l'origine $s$. Si $t$ est nul, il n'y a pas de chemin de $s$ vers $t$.
\subsection{Problème du flot maximum}
\label{sec:flotmaximum}
Définition du problème:
\begin{itemize}
\item$s$: Source
\item$t$: Puits
\item$c(a,b)$: Capacité
\item$f(a,b)=-f(b,a)$: Flot
\item Instance: $FlotMaximum(G=(V,E),s,t,c)$
\end{itemize}
Contraintes: un flot valide satisfait ces contraintes
\begin{itemize}
\item Conservation du flot:
\begin{align}
\sum_{b \mid (b,a) \in E} f(b,a) &= \sum_{b \mid (a,b) \in E} f(a,b) &\forall a \in V \setminus\lbrace s,t \rbrace
\end{align}
\item Ce qui équivaut à:
\begin{align}
\sum_{b \in V} f(a,b) &= 0 &\forall a \in V \setminus\lbrace s,t \rbrace
\end{align}
\item Contrainte de capacité:
\begin{align}
f(a,b) &\leq c(a,b) &\forall (a,b) \in E \\
f(a,b) &\leq 0 &\forall (a,b) \notin E
\end{align}
\end{itemize}
Le problème du flot maximum consiste à trouver un flot valide dont la valeur est maximale
\begin{align}
v(f) &= \sum_{a \in V}f(s,a)\\
&= \sum_{a \in V} f(a,t)
\end{align}
Représentation graphique
\begin{figure}[!ht]
\centering
\includegraphics[width=12cm]{exemple_flot}
\caption{Représentation graphique d'un flot}
\label{fig:grapheflot}
\end{figure}
\subsection{Chemins augmentant}
\label{sec:cheminsaugmentant}
Objectif: Identifier les chemins augmentants dans le graphe résiduel
\paragraph{Graphe résiduel}
\begin{itemize}
\item Utilisé pour identifier les chemins reliant la source au puits
\item Mêmes noeuds que le graphe original, mais les arêtes peuvent avoir un poids et une orientation différente
\item Notation: $G_f =(V, E_f)$
\item Existence d'une arête dans le graphe résiduel
\begin{align}
(a,b) \in E_{f}\iff f(a,b) < c(a,b)
c_f(a.b) = c(a,b) - f(a.b)
\end{align}
\item Chemin augmentant: relie la source au puits dans le graphe résiduel. Non nul
\end{itemize}
Exemple de graphe résiduel (Figure \ref{fig:grapheresiduel})