Certains problèmes de transport (de marchandises, de fluides, d'énergie, etc) dans un réseau (routier, de distribution, etc) sont représentables de façon naturelle par des graphes dont les sommets sont des points de passage (sans stockage) et les arcs des trajets entre ces points. Le problème consiste à maximiser l'utilisation de tels réseaux, c'est-à-dire à calculer la quantité maximale transportable compte tenu des contraintes. Ce problème a bien d'autres réalisations, par exemple pour déterminer un appariement maximum dans un graphe biparti.
On modélise un réseau de transport à l'aide d'un graphe , muni d'une fonction de capacité , telle que c(x,y)=0 si . On suppose qu'un sommet source s et un sommet puits t ont été désignés (figure 2.22).
On appelle flot une fonction telle que (contraintes de capacité et de conservation, Cf. les lois de Kirchhoff) :
Le problème est de déterminer un flot de valeur maximale. Sa résolution fait appel à la notion de réseau résiduel d'un flot. Étant donné un réseau de graphe et de capacité c et un flot f, on définit cf(x,y) = c(x,y) - f(x,y), pour ; le réseau résiduel de f est défini par le graphe dont l'ensemble des arcs est , et par la capacité cf(figure 2.24) ; on notera que Af n'est pas nécessairement inclus dans A, car il peut contenir aussi l'arc réciproque d'un arc de A.
Un chemin d'augmentation de f dans un réseau est un chemin
simple (c'est-à-dire sans boucle) de s vers t dans le graphe
résiduel
.
La capacité d'un chemin p est la quantité
c(p) maximale transportable le long de p, soit
.
Un chemin d'augmentation permet
d'augmenter f en définissant le flot noté f+p(figure 2.25) :
On montre alors qu'un flot est maximal si et seulement si son graphe résiduel ne contient aucun chemin d'augmentation. L'algorithme de Ford-Fulkerson (1956) consiste à augmenter le flot selon un chemin d'augmentation s'il en existe :
Il faut choisir une structure de données adéquate ; on notera que les graphes résiduels partagent le même ensemble de sommets, mais que l'ensemble des arcs est variable. Correctement implémenté, cet algorithme a une complexité en O(|S| |A|2).