Skip to content

📌 1. DĂ©finitions & Cadre d'Ă©tude

Soit G=(V,E)G = (V, E) un graphe orientĂ© ou non orientĂ©, oĂč VV reprĂ©sente l’ensemble des sommets et EE l’ensemble des arĂȘtes (ou arcs). On note ∣V∣=n|V| = n le nombre de sommets et ∣E∣=m|E| = m le nombre d’arĂȘtes.

  • RĂ©seau de transport : Un quadruplet N=(V,S,P,c)N = (V, S, P, c) oĂč :
    • G=(V,E)G = (V, E) est un graphe orientĂ©.
    • S∈VS \in V est la source (de degrĂ© entrant nul).
    • P∈VP \in V est le puits (de degrĂ© sortant nul).
    • c:E→R+c : E \to \mathbb{R}_+ est une application appelĂ©e capacitĂ©. Flot: Une application f:E→Rf : E \to \mathbb{R} est un flot sur NN si elle satisfait les conditions suivantes :
    1. AntisymĂ©trie (pour les graphes implicites) ou positivitĂ© : ∀e∈E,  0≀f(e)≀c(e)\forall e \in E, \; 0 \le f(e) \le c(e).
    2. Conservation du flot : ∀u∈V∖{S,P}\forall u \in V \setminus \{S, P\}, ∑v∈V t.q. (u,v)∈Ef((u,v))=∑v∈V t.q. (v,u)∈Ef((v,u))\sum_{v \in V \text{ t.q. } (u,v) \in E} f((u,v)) = \sum_{v \in V \text{ t.q. } (v,u) \in E} f((v,u))
  • Valeur d’un flot : La valeur ∣f∣|f| d’un flot ff est la quantitĂ© totale sortant de la source : ∣f∣=∑v∈V t.q. (S,v)∈Ef((S,v))|f| = \sum_{v \in V \text{ t.q. } (S,v) \in E} f((S,v)) Coupe: Une coupe (A,B)(A, B) du rĂ©seau est une partition de VV telle que S∈AS \in A et P∈BP \in B.
  • CapacitĂ© d’une coupe : c(A,B)=∑u∈A,v∈B t.q. (u,v)∈Ec((u,v))c(A, B) = \sum_{u \in A, v \in B \text{ t.q. } (u,v) \in E} c((u,v)).

📐 2. ThĂ©orĂšmes fondamentaux & DĂ©monstrations clĂ©s

Section titled “📐 2. ThĂ©orĂšmes fondamentaux & DĂ©monstrations clĂ©s”

ÉnoncĂ© : Dans tout rĂ©seau de transport, la valeur maximale d’un flot est Ă©gale Ă  la capacitĂ© minimale parmi toutes les coupes du rĂ©seau.

  1. Lemme prĂ©liminaire (Faible dualitĂ©) : Soit ff un flot quelconque et (A,B)(A, B) une coupe quelconque. Par sommation sur la conservation du flot et les bornes de capacitĂ©, on montre que ∣fâˆŁâ‰€c(A,B)|f| \le c(A, B). En particulier, la valeur de tout flot est minorĂ©e par la capacitĂ© de toute coupe.
  2. Saturation et maximalitĂ© : Si l’on dispose d’un flot ff pour lequel il n’existe plus de chemin augmentant dans le graphe rĂ©siduel GfG_f, on construit explicitement une coupe (A,B)(A, B) oĂč AA est l’ensemble des sommets accessibles depuis SS dans GfG_f.
  3. On vĂ©rifie que P∉AP \notin A (sinon il y aurait un chemin augmentant) et que le flot net traversant cette coupe sature toutes les arĂȘtes de AA vers BB. Ainsi, ∣f∣=c(A,B)|f| = c(A, B), ce qui prouve Ă  la fois l’optimalitĂ© du flot et l’égalitĂ© du thĂ©orĂšme. ■\blacksquare

L’algorithme d’Edmonds-Karp est une implĂ©mentation de la mĂ©thode de Ford-Fulkerson qui utilise un parcours en largeur (BFS) pour trouver le chemin augmentant le plus court (en nombre d’arĂȘtes) dans le graphe rĂ©siduel.

  • ComplexitĂ© en temps : O(n⋅m2)\mathcal{O}(n \cdot m^2)
  • ComplexitĂ© en espace : O(n+m)\mathcal{O}(n + m)
from collections import deque
def bfs(s, t, parent, residual_graph, n):
visited = [False] * n
queue = deque([s])
visited[s] = True
while queue:
u = queue.popleft()
for v in range(n):
if not visited[v] and residual_graph[u][v] > 0:
queue.append(v)
visited[v] = True
parent[v] = u
if v == t:
return True
return False
def edmonds_karp(capacity, s, t):
n = len(capacity)
# Matrice du graphe résiduel initialisée avec les capacités
residual_graph = [row[:] for row in capacity]
parent = [-1] * n
max_flow = 0
while bfs(s, t, parent, residual_graph, n):
# Trouver la capacite residuelle minimale le long du chemin trouve par BFS
path_flow = float("inf")
v = t
while v != s:
u = parent[v]
path_flow = min(path_flow, residual_graph[u][v])
v = u
# Mettre a jour les capacites residuelles des aretes et des aretes inverses
v = t
while v != s:
u = parent[v]
residual_graph[u][v] -= path_flow
residual_graph[v][u] += path_flow
v = u
max_flow += path_flow
return max_flow

  1. Graphes non orientĂ©s : Ne pas oublier de dĂ©doubler les arĂȘtes non orientĂ©es en deux arcs opposĂ©s dans la matrice de capacitĂ© lors de la modĂ©lisation sous forme de rĂ©seau de transport.
  2. CapacitĂ©s irrationnelles : Avec des capacitĂ©s rĂ©elles quelconques, l’algorithme de Ford-Fulkerson naĂŻf (via DFS arbitraire) peut ne pas terminer ou converger vers une valeur autre que le flot maximal. En MPI, on utilise systĂ©matiquement Edmonds-Karp ou Dinitz pour garantir la terminaison polynomiale.
  3. Confusion entre flot et capacitĂ© rĂ©siduelle : Lors de la mise Ă  jour du graphe rĂ©siduel, l’erreur classique est d’oublier d’incrĂ©menter la capacitĂ© de l’arc retour (flux nĂ©gatif ou arĂȘte inverse), ce qui interdit la “repentir” (annulation d’un choix glouton antĂ©rieur).
  4. ComplexitĂ© spatiale : Utiliser des matrices d’adjacence A∈Mn,n(R)A \in \mathcal{M}_{n,n}(\mathbb{R}) pour des graphes creux (mâ‰Șn2m \ll n^2) entraĂźne un dĂ©passement mĂ©moire (O(n2)\mathcal{O}(n^2)). PrĂ©fĂ©rer les listes d’adjacence pour les structures rĂ©siduelles si nn est grand.