efrei/theorie-graphes/main.tex
2022-03-07 17:07:15 +01:00

351 lines
13 KiB
TeX

\documentclass[a4paper,french,12pt]{article}
\title{Théorie des graphes}
\author{}
\date{Dernière compilation~: \today{} à \currenttime}
\usepackage{../cours}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\usetikzlibrary{automata, arrows.meta, positioning}
\begin{document}
\maketitle
\tableofcontents
\clearpage
\section{Définitions}
Un graphe est un ensemble de sommets qui possèdent des relations.
Quand les relations sont symétriques, le graphe est \emph{non orienté}.
Les relations sont alors appelées des \emph{arrêtes}.
L'arrête $(x,y)$ est équivalente à l'arrête $(y,x)$.
Quand les relations sont non symétriques, la relation dépend d'une direction.
Le graphe est alors \emph{orienté} et les relations s'appelent des \emph{arcs}.
Un graphe peut contenir des arcs et des arrêtes, mais on dira quand même qu'il est soit \emph{orienté} soit \emph{non orienté}.
Dès qu'il existe des relations non symétriques, donc des arcs, on parle donc de graphe orienté.
On peut ajouter une valeur aux relations (par exemple pour le calcul d'un temps de trajet, ou un coût pour le calcul d'une route OSPF).
On parle alors de graphe \emph{valué}.
S'il n'y pas de valeur associée aux relations, le graphe est \emph{non valué}.
\subsection{Matrice d'un graphe orienté}
\begin{multicols}{2}
On peut passer d'une représentation graphique à un tableau~: \\\\
\begin{tabularx}{\linewidth}{YYYYY}
& A & B & C & D \\
A & 0 & 1 & 1 & 1 \\
B & 0 & 0 & 0 & 0 \\
C & 0 & 1 & 0 & 1 \\
D & 0 & 1 & 0 & 0 \\
\end{tabularx}
\begin{center}
\begin{tikzpicture}[-latex,auto,x=2cm,y=2cm]
\node(a)[state] at (0,0) {A};
\node(b)[state] at (2,0) {B};
\node(c)[state] at (2,-2) {C};
\node(d)[state] at (0,-2) {D};
\path
(a) edge (b)
(a) edge (c)
(a) edge (d)
(c) edge (b)
(c) edge (d)
(d) edge (b)
;
\end{tikzpicture}
\end{center}
\end{multicols}
\subsection{Types de graphes}
\subsubsection{Graphe Eulerien}
\begin{itemize}
\item Il existe un cycle passant par toutes les arrêtes.
\item Le degré de tous les sommets est \emph{pair}.
\end{itemize}
\subsubsection{Graphe semi-Eulerien}
\begin{itemize}
\item Il existe un chemin avec un départ et une arrivée différents, tel que l'on passe par toutes les arrêtes.
\item Seuls deux sommets sont de degrés \emph{impairs}.
Ce sont le départ et l'arrivée.
Les autres sommets sont de degré \emph{pair}.
\end{itemize}
\subsection{Fonction $\Gamma$}
\subsubsection{Extrémité, prédécesseur, successeur}
Soit $G=(S,A)$ un graphe.
Soient $x$ et $y$ deux sommets de $S$.
$a=(x,y)$ (arrête ou arc) étant un élément de l'ensemble $A$, $x$ et $y$ sont alors des \emph{extrémités} de $a$.
Si $a$ est un arc (donc orienté) allant de $x$ à $y$, alors $x$ est le \emph{prédécesseur} de $y$ et $y$ est le \emph{successeur} de $x$.
\subsubsection{Prédécesseurs et successeurs directs}
$\Gamma^{-1}(x)$ désigne l'ensemble des prédécesseurs de $x$. \\
$\Gamma^{+1}(x)$ désigne l'ensemble des successeurs de $x$.
\subsubsection{Prédécesseurs et successeurs indirects}
$\Gamma^{-n}(x)$ désigne l'ensemble des prédécesseurs de niveau $n$ de $x$. \\
$\Gamma^{+n}(x)$ désigne l'ensemble des successeurs de niveau $n$ de $x$.
On peut définir $\Gamma^{-n}(x)$ comme étant l'ensemble des prédécesseurs des $\Gamma^{-n+1}(x)$. \\
On peut définir $\Gamma^{+n}(x)$ comme étant l'ensemble des successeurs des $\Gamma^{+n-1}(x)$.
\subsubsection{Prédécesseurs et successeurs directs et/ou indirects}
Les ensembles des prédécesseurs et successeurs de $x$ de niveau quelconque sont notés respectivement $\Gamma^{-*}(x)$ et $\Gamma^{+*}(x)$.
On peut les calculer avec une somme infinie~:
\begin{equation*}
\Gamma^{+*}(x) = \Gamma^{+1}(x) \cup \Gamma^{+2}(x) \cup \Gamma^{+2}(x) \cup \cdots \cup \Gamma^{+n}(x)
\end{equation*}
Cette somme n'est pas infinie dans la mesure où le nombre de sommets est fini.
Quand on compte les prédécesseurs ou les successeurs, à chaque étape ajoutant aux ensembles précédents, au bout d'un moment on va trouver quelque chose de stable.
\subsection{Connexité}
Si pour tout $x$ et tout $y$ d'un graphe il existe un chemin allant de $x$ à $y$, le graphe est dit connexe.
Si le graphe est orienté, il est alors \emph{fortement connexe}.
\subsection{Incidence}
\begin{center}
\begin{tikzpicture}
\node(x)[state] at (0,0) {x};
\node(y)[state] at (2,0) {y};
\path [->] (x) edge (y);
\end{tikzpicture}
\end{center}
L'arc est incident de $x$ vers l'extérieur (parce qu'il sort de $x$) et de $y$ vers l'intérieur (parce qu'il entre dans $y$).
\subsection{Degré d'un sommet}
Le degré intérieur $d\text{°}^-(x)$ d'un sommet $x$ est le total d'incidents de $x$ vers l'intérieur. \\
Le degré extérieur $d\text{°}^+(x)$ d'un sommet $x$ est le total d'incidents de $x$ vers l'extérieur.
Le degré $d\text{°}(x)$ d'un sommet $x$ est la somme de $d\text{°}^-(x)$ et de $d\text{°}^+(x)$.
\subsection{Point d'entrée}
Un point d'entrée n'a pas de prédécesseur ($\Gamma^{-1}(x) = \emptyset$).
\subsection{Point de sortie}
Un point de sortie n'a pas de successeur ($\Gamma^{+1}(x) = \emptyset$).
\subsection{Point isolé}
Un point isolé est à la fois un point d'entrée et de sortie.
Il n'a pas de successeur ni de prédécesseur ($\Gamma^{-1}(x) \cup \Gamma^{+1}(x) = \emptyset$).
\subsection{Fermeture transitive}
Une fermeture transitive est un ``raccourci'' entre deux sommets.
Si un arc ou une arrête existe entre $x$ et $y$, la fermeture transitive de $x$ et $y$ est $(x,y)$.
\section{Représentation et algorithmes généraux}
On définit des matrices pour qu'une machine puisse avoir une représentation du graphe.
\subsection{Matrices d'adjacence et d'incidence}
\subsubsection{Matrice d'adjacence}
On code à 1 quand les sommets sont reliés.
\begin{center}
\begin{tabular}{cc|cccccc|c}
& & \multicolumn{6}{c}{sommets} & \\
& & A & B & C & D & E & F & $d^+$ \\
\hline
\multirow{6}{*}{sommets} & A & 0 & 1 & 1 & 0 & 0 & 0 & 2 \\
& B & 0 & 0 & 0 & 1 & 0 & 0 & \\
& C & 0 & 1 & 0 & 0 & 1 & 0 & \\
& D & 0 & 0 & 1 & 0 & 0 & 1 & \\
& E & 0 & 0 & 1 & 0 & 0 & 0 & \\
& F & 1 & 0 & 0 & 0 & 1 & 0 & \\
\hline
& $d^-$ & 1 & & & & & & \\
\end{tabular}
\end{center}
On peut ajouter le degré~: arcs entrants ($d^-$) ou arcs sortants ($d^+$).
\paragraph{Exemple}
\begin{multicols}{2}
Non orienté~:
\begin{tikzpicture}
\node (a)[state] at (0,0) {A};
\node (b)[state] at (2,0) {B};
\path
(a) edge [loop above] (a)
(a) edge (b)
;
\end{tikzpicture}
\begin{align*}
\begin{pmatrix}
1 & 1 \\
1 & 0 \\
\end{pmatrix}
\end{align*}
\columnbreak
Orienté~:
\begin{tikzpicture}[->]
\node (a)[state] at (0,0) {A};
\node (b)[state] at (2,0) {B};
\path
(a) edge [loop above] (a)
(a) edge (b)
;
\end{tikzpicture}
\begin{align*}
\begin{pmatrix}
1 & 1 \\
0 & 0 \\
\end{pmatrix}
\end{align*}
\end{multicols}
\subsubsection{Matrice d'incidence}
On note -1 pour une transition entrante et +1 pour une transition sortante.
Pour les boucles, on note 2.
\begin{center}
\begin{tabular}{cc|cccccc}
& & \multicolumn{6}{c}{nombre d'arcs} \\
& & 1 & 2 & 3 & 4 & 5 & 6 \\
\hline
\multirow{6}{*}{sommets} & A & -1 & 0 & 0 & 0 & 0 & 0 \\
& B & +1 & +1 & 0 & -1 & 0 & 0 \\
& C & 0 & 0 & 0 & 0 & 0 & 0 \\
& D & 0 & -1 & -1 & +1 & 0 & 0 \\
& E & 0 & 0 & 0 & 0 & 0 & 0 \\
& F & 0 & 0 & +1 & 0 & 0 & 2 \\
\end{tabular}
\end{center}
\subsection{Algorithmes généraux}
\subsubsection{Calcul de rang}
\subsubsection{Détection de cycle (algorithme de Rosalind-Marimond)}
L'algorithme de Rosalind-Marimond supprime les $d^-$ (connexions entrantes) et les $d^+$ (connexions sortantes) à chaque étape.
\subsubsection{Parcours en largeur}
On \emph{enfile} à chaque n\oe{}ud ses enfants directs.
\begin{multicols}{2}
\begin{tikzpicture}[yscale=1.5]
\node (a) [state] at (0,0) {a};
\node (b) [state] at (-2,-1) {b};
\node (c) [state] at (2,-1) {c};
\node (d) [state] at (-3,-2) {d};
\node (e) [state] at (-1,-2) {e};
\node (f) [state] at (1,-2) {f};
\node (g) [state] at (3,-2) {g};
\node (h) [state] at (-1,-3) {h};
\node (i) [state] at (3,-3) {i};
\node at (3, -3.5) {non visité};
\path
(a) edge (b)
(a) edge (c)
(b) edge (d)
(b) edge (e)
(c) edge (f)
(c) edge (g)
(e) edge (h)
;
\end{tikzpicture}
\begin{itemize}
\item a
\item bc
\item cde
\item defg
\item efg
\item fgh
\item gh
\item h
\end{itemize}
\end{multicols}
\subsubsection{Parcours en longueur}
On \emph{empile} à chaque n\oe{}ud ses enfants directs.
\begin{multicols}{2}
\begin{tikzpicture}[yscale=1.5]
\node (a) [state] at (0,0) {a};
\node (b) [state] at (-2,-1) {b};
\node (c) [state] at (2,-1) {c};
\node (d) [state] at (-3,-2) {d};
\node (e) [state] at (-1,-2) {e};
\node (f) [state] at (1,-2) {f};
\node (g) [state] at (3,-2) {g};
\node (h) [state] at (-1,-3) {h};
\node (i) [state] at (3,-3) {i};
\node at (3, -3.5) {non visité};
\path
(a) edge (b)
(a) edge (c)
(b) edge (d)
(b) edge (e)
(c) edge (f)
(c) edge (g)
(e) edge (h)
;
\end{tikzpicture}
\begin{itemize}
\item a
\item bc
\item dec
\item ec
\item hc
\item c
\item fg
\item g
\end{itemize}
\end{multicols}
\end{document}