Skip to content

Cours : Algorithmique avancée et graphes

Fiche de Cours : Algorithmique Avancée et Graphes

Section titled “Fiche de Cours : Algorithmique Avancée et Graphes”

Filière : MP / MPI (Deuxième année)
Matière : Informatique


1. Rappels et Représentations des Graphes

Section titled “1. Rappels et Représentations des Graphes”

Un graphe orienté G=(S,A)G = (S, A) est défini par un ensemble fini de sommets SS (ou VV) et un ensemble d’arcs AA (ou EE) qui sont des couples d’éléments de SS. Pour les graphes non orientés, AA est un ensemble de paires (arêtes). On pose ∣S∣=n|S| = n et ∣A∣=m|A| = m.

Structures de données usuelles en Ocaml / Python

Section titled “Structures de données usuelles en Ocaml / Python”
  1. Matrice d’adjacence : Tableau 2D de booléens ou de poids de taille n×nn \times n.
    • Complexité spatiale : O(n2)\mathcal{O}(n^2).
    • Test d’adjacence : O(1)\mathcal{O}(1).
    • Itération sur les voisins : O(n)\mathcal{O}(n).
  2. Listes d’adjacence : Tableau ou table de hachage associant à chaque sommet la liste de ses voisins.
    • Complexité spatiale : O(n+m)\mathcal{O}(n + m).
    • Test d’adjacence : O(degreˊ sortant)\mathcal{O}(\text{degré sortant}).
    • Itération sur les voisins : O(degreˊ sortant)\mathcal{O}(\text{degré sortant}).

Section titled “2.1 Parcours en Largeur (BFS - Breadth-First Search)”

Utilise une file (FIFO). Idéal pour calculer les plus plus courts chemins dans un graphe non pondéré.

  • Complexité temporelle : O(n+m)\mathcal{O}(n + m) (avec listes d’adjacence).
Section titled “2.2 Parcours en Profondeur (DFS - Depth-First Search)”

Utilise une pile (LIFO) ou la récursivité. Permet de dater l’entrée et la sortie des sommets (dates de découverte et de fin de traitement), fondamental pour l’analyse structurelle des graphes.


3.1 Algorithme de Dijkstra (Plus courts chemins à sources multiples / unique)

Section titled “3.1 Algorithme de Dijkstra (Plus courts chemins à sources multiples / unique)”
  • Problème : Étant donné un graphe G=(S,A)G = (S, A) muni d’une fonction de poids positif ω:A→R+\omega : A \to \mathbb{R}^+ et un sommet source ss, trouver les distances minimales de ss à tous les autres sommets.
  • Principe : Programmation dynamique / Glouton. On maintient un ensemble de sommets traités dont la distance minimale est définitive.
  • Complexité avec une file de priorité (tas min) : O((n+m)log⁡n)\mathcal{O}((n + m) \log n)
  • Problème : Idem Dijkstra, mais autorise les poids négatifs. Détecte la présence de circuits absorbants (de poids strictement négatif).
  • Complexité temporelle : O(n⋅m)\mathcal{O}(n \cdot m).

3.3 Algorithme de Floyd-Warshall (Plus courts chemins de toutes les paires)

Section titled “3.3 Algorithme de Floyd-Warshall (Plus courts chemins de toutes les paires)”
  • Problème : Trouver les plus courts chemins entre toutes les paires de sommets.
  • Principe (Programmation dynamique) : Soit d(k)(i,j)d^{(k)}(i, j) la distance minimale de ii à jj en n’utilisant que des sommets intermédiaires dans l’ensemble {1,…,k}\{1, \dots, k\}. d(k)(i,j)=min⁡(d(k−1)(i,j), d(k−1)(i,k)+d(k−1)(k,j))d^{(k)}(i, j) = \min\left( d^{(k-1)}(i, j), \, d^{(k-1)}(i, k) + d^{(k-1)}(k, j) \right)
  • Complexité temporelle : O(n3)\mathcal{O}(n^3).
  • Complexité spatiale : O(n2)\mathcal{O}(n^2).

4. Arbres Couvrants de Poids Minimal (ACPM)

Section titled “4. Arbres Couvrants de Poids Minimal (ACPM)”

On cherche un sous-graphe acyclique couvrant tous les sommets dont la somme des poids des arêtes est minimale (graphe non orienté connexe).

  1. Trier toutes les arêtes par ordre de poids croissant.
  2. Parcourir les arêtes et les ajouter à l’ACPM si elles ne créent pas de cycle (test réalisé grâce à une structure de Union-Find / Disjoint-Set).
  • Complexité temporelle : O(mlog⁡m)=O(mlog⁡n)\mathcal{O}(m \log m) = \mathcal{O}(m \log n) (dominée par le tri des arêtes).

Similaire à Dijkstra, on fait croître un arbre à partir d’un sommet en ajoutant à chaque étape l’arête de plus petit poids connectant l’arbre à un nouveau sommet.

  • Complexité temporelle : O((n+m)log⁡n)\mathcal{O}((n + m) \log n) avec un tas binaire.

Un réseau de transport est un graphe orienté G=(S,A)G = (S, A) avec :

  • Une source s∈Ss \in S (sans prédécesseur) et un puits p∈Sp \in S (sans successeur).
  • Une capacité c(u,v)≥0c(u, v) \ge 0 pour chaque arc (u,v)(u, v).

Un flot est une fonction f:A→R+f : A \to \mathbb{R}^+ telle que :

  1. Contrainte de capacité : ∀(u,v)∈A,0≤f(u,v)≤c(u,v)\forall (u, v) \in A, \quad 0 \le f(u, v) \le c(u, v).
  2. Conservation du flot : ∀v∈S∖{s,p},∑(u,v)∈Af(u,v)=∑(v,w)∈Af(v,w)\forall v \in S \setminus \{s, p\}, \quad \sum_{(u, v) \in A} f(u, v) = \sum_{(v, w) \in A} f(v, w).

La valeur du flot est la quantité totale sortant de la source : ∣f∣=∑(s,v)∈Af(s,v)|f| = \sum_{(s, v) \in A} f(s, v).

  • Principe : Utilisation du graphe résiduel GfG_f et recherche de chemins augmentants (par BFS ou DFS dans GfG_f).
  • Théorème du flot maximal / coupe minimale (Ford-Fulkerson) : Un flot est maximal si et seulement s’il n’existe plus de chemin augmentant dans le graphe résiduel.
  • Complexité : Si les capacités sont des entiers, l’algorithme termine en O(m⋅∣f∗∣)\mathcal{O}(m \cdot |f^*|) où ∣f∗∣|f^*| est la valeur du flot maximal.
  • Variante (Edmonds-Karp) : En choisissant les chemins augmentants les plus courts via un BFS, la complexité devient polynomiale : O(n⋅m2)\mathcal{O}(n \cdot m^2)

6. Algorithmique Avancée sur les Chaînes (Complément)

Section titled “6. Algorithmique Avancée sur les Chaînes (Complément)”

Recherche efficace d’un motif WW de longueur mm dans un texte TT de longueur nn.

  • Principe : Utilisation d’une table de transpositions (le tableau π\pi ou pi-table) précalculée sur le motif pour éviter de relire les caractères déjà comparés dans le texte.
  • Complexité temporelle : O(n+m)\mathcal{O}(n + m) (garantie dans le pire des cas, contrairement à l’algorithme naïf en O(n⋅m)\mathcal{O}(n \cdot m)).