Flots et couplages
Ce que ce chapitre apporte 6 points
- Définir un réseau de transport, un flot, sa valeur, et une coupe.
- Comprendre le graphe résiduel et la nécessité des arcs inverses.
- Dérouler Ford-Fulkerson sur un petit réseau.
- Énoncer le théorème flot-max coupe-min et s'en servir pour prouver une optimalité.
- Modéliser la recherche d'un couplage biparti maximum comme un problème de flot.
- Appliquer le théorème de Hall pour justifier qu'aucun couplage ne place tous les candidats.
Le réseau de transport
Un réseau de transport est un graphe orienté où chaque arc porte une capacité positive, avec deux sommets distingués : une source et un puits .
Un flot associe à chaque arc une valeur comprise entre 0 et sa capacité, telle qu'en tout sommet autre que et , ce qui entre égale ce qui sort.
La valeur du flot est ce qui sort de la source, moins ce qui y entre éventuellement ; c'est aussi ce qui arrive au puits.
Dans les réseaux de ce chapitre, la source n'a aucun arc entrant et le puits aucun arc sortant : ce sont une source et un puits au sens du chapitre sur les représentations, une colonne vide et une ligne vide dans la matrice d'adjacence.
Conservation : rien ne se perd ni ne se crée en cours de route, sauf à la source et au puits.
Toute la théorie découle de ces deux règles, et toute erreur de modélisation vient d'en avoir oublié une.
Chemins augmentants et graphe résiduel
L'idée naïve consiste à chercher un chemin de la source au puits, à y pousser autant que possible, puis à recommencer. Elle fonctionne presque : il lui manque la possibilité de revenir sur une décision.
Le graphe résiduel contient, pour chaque arc de capacité portant un flot :
un arc direct de capacité résiduelle , ce qu'on peut encore ajouter ;
un arc inverse de capacité , ce qu'on peut annuler.
Pourquoi l'arc inverse est indispensable. Sans lui, un premier chemin mal choisi bloque définitivement une partie du réseau, et l'algorithme s'arrête sur un flot qui n'est pas maximal.
L'arc inverse permet à un chemin ultérieur d'emprunter la conduite à l'envers, ce qui revient à dire : « ce que j'avais envoyé par là, je le réoriente ». Le flot reste valide à chaque étape, et l'algorithme peut corriger ses propres choix.
C'est le détail qui fait passer d'une heuristique à un algorithme exact.
Le plus petit réseau où l'on voit le problème
Cinq arcs, tous de capacité 1. Le flot maximal vaut 2 : une unité par , une autre par . Voici pourtant ce que fait l'idée naïve si elle tombe d'abord sur le chemin du milieu, . La figure s'ouvre après ce premier envoi, arcs inverses désactivés.
Chaque arc porte flot / capacité, et s'épaissit avec son flot. Cliquer un arc pour changer sa capacité.
Valeur du flot : 1 (1 envoi)
Plus aucun chemin de s à t sans arc inverse. Ce que s atteint encore dans le graphe résiduel, côté 0 : s et b ; le reste, côté 1 : a et t.
Coupe : s → a (1) + b → t (1) = 2, pour un flot de 1. Elle ne certifie rien : a → b ramène du flot vers le côté de s. Réactiver les arcs inverses : un chemin reparaît.
Le graphe résiduel, lui, ne s'arrête pas là. Chaque arc saturé y laisse un arc inverse de capacité 1, celle du flot qu'il porte, et l'un d'eux rouvre un chemin.
Cliquer b, puis a, puis t : le chemin emprunte à contresens. Le pousser : le flot passe à 2, et, de retour à la vue du réseau, ne porte plus rien.
Le flot final est donc 1 sur , 1 sur , 0 sur , 1 sur et 1 sur : valeur 2. L'algorithme n'a pas « ajouté du flot dans le mauvais sens », il a réorienté celui qu'il avait mal placé.
À quoi sert l'arc inverse du graphe résiduel ?
Tant qu'il existe un chemin de à dans le graphe résiduel, y pousser le minimum des capacités résiduelles rencontrées, puis mettre à jour.
Quand il n'en existe plus, le flot est maximal.
Quand on choisit systématiquement le chemin le plus court, en nombre d'arcs, par un BFS, l'algorithme s'appelle Edmonds-Karp et sa complexité est bornée par , indépendamment des capacités.
Le programme ci-dessous range les capacités dans un dictionnaire indexé par les arcs : la clé ("S", "A") désigne l'arc . C'est plus commode ici que la liste d'adjacence du chapitre 2, parce que chaque arc inverse doit porter sa propre valeur. Le BFS examine les voisins dans l'ordre alphabétique : quand deux chemins ont la même longueur, c'est cet ordre qui décide lequel est retenu.
Le théorème flot-max coupe-min
Une coupe est une partition des sommets en deux parties, l'une contenant la source, l'autre le puits. Sa capacité est la somme des capacités des arcs allant du côté source vers le côté puits.
Toute quantité qui va de à doit traverser chaque coupe. Donc la valeur de tout flot est inférieure ou égale à la capacité de toute coupe. Le théorème dit que les deux valeurs se rejoignent.
où est le côté de la coupe qui contient la source, celui qui contient le puits, et la capacité de la coupe.
Ce que ce genre de théorème apporte. Il donne un certificat vérifiable. Pour convaincre quelqu'un qu'un flot est maximal, on n'a pas à raconter le déroulement de l'algorithme : il suffit d'exhiber une coupe de même capacité.
L'interlocuteur vérifie deux choses simples, que le flot est valide et que la coupe a bien cette capacité, et la conclusion s'impose. C'est la même structure de preuve qu'au chapitre 7, où une clique minore et une coloration majore, et c'est une forme d'argument qu'il faut savoir reconnaître.
La coupe minimale s'obtient gratuitement à la fin de l'algorithme : ce sont les arcs saturés qui séparent les sommets encore atteignables depuis la source, dans le graphe résiduel, de tous les autres.
La coupe, sur le réseau du chapitre
Le flot maximal du réseau dessiné plus haut vaut 13. Voici une répartition qui l'atteint, celle que trouve le programme ci-dessus en trois chemins, chaque arc portant flot / capacité. Il en existe d'autres (7 sur , 2 sur , 6 sur , le reste inchangé, vaut aussi 13), mais toutes saturent les deux arcs de la coupe.
Chaque arc porte flot / capacité, et s'épaissit avec son flot. Cliquer un arc pour changer sa capacité.
Valeur du flot : 13 (3 envois)
Plus aucun chemin de S à T. Ce que S atteint encore dans le graphe résiduel, côté 0 : S, A, C, D et B ; le reste, côté 1 : T.
Coupe : C → T (7) + D → T (6) = 13, égale à la valeur du flot. Aucun flot ne dépasse une coupe, aucune coupe ne descend sous un flot : les deux sont optimaux, et la coupe en est le certificat.
Cliquer ensuite l'arc et porter sa capacité à 20 : aucun chemin n'apparaît, le flot reste 13. Porter plutôt de 7 à 8 : un chemin reparaît, , qui pousse 1, et le flot passe à 14.
C'est l'égalité qui certifie, et non le seul fait de s'arrêter. La petite figure du début s'arrêtait elle aussi faute de chemin, arcs inverses désactivés ; mais la coupe qu'elle affichait valait 2 pour un flot de 1, et le flot n'était pas maximal.
Le flot. Ce qui sort de vaut , et ce qui entre dans vaut . La conservation se vérifie sommet par sommet : en , il entre 8 et il sort .
La conclusion. Les deux nombres coïncident, donc aucun flot ne peut dépasser 13 et aucune coupe ne peut descendre en dessous. Les deux sont optimaux, et il n'a pas fallu parler de l'algorithme une seule fois.
Élargir un goulot fait monter le débit, mais seulement jusqu'à la coupe suivante : porter de 7 à 8 donne 14, mais le porter à 107 ne donne que 15, et non 113, parce que trois autres coupes valent 15.
Et quand plusieurs coupes minimales existent, l'élargissement doit toucher chacune d'elles : élargir un arc d'une seule laisse l'autre en place, et le débit ne bouge pas.
C'est la lecture qui rend le théorème utile en dehors des mathématiques : il ne dit pas seulement combien on peut faire passer, il dit où se trouve la limite.
Comment convaincre quelqu'un qu'un flot est maximal, sans lui faire refaire l'algorithme ?
Couplages
Un couplage est un ensemble d'arêtes deux à deux sans extrémité commune.
Il est maximum s'il contient le plus grand nombre possible d'arêtes, parfait s'il couvre tous les sommets.
Le cas biparti est celui qu'on rencontre : des candidats d'un côté, des postes de l'autre, une arête quand la candidature est recevable. Ici, Bruno n'accepte que Base, et Ana comme Chloe la convoitent aussi. La figure s'ouvre sur une affectation faite au fil de l'eau : Ana sur Base, puis Chloe sur Web.
Trait épais : le couplage. Contour tireté : sans affectation. Cliquer une arête pour la prendre ou la rendre.
Couplage de taille 2 : Ana-Base, Chloe-Web.
Sans poste : Bruno. Vacant : Reseau.
Vider ensuite le couplage, le reconstruire autrement, et redemander un chemin : tant qu'un candidat reste sans poste, la figure en trouve un ; quand tous sont placés, il n'y en a plus.
Un couplage de taille 3 existe donc : Ana-Reseau, Bruno-Base, Chloe-Web.
C'est l'erreur de qui affecte au fil de l'eau. Pour aller plus loin, il faut défaire une affectation, exactement comme l'arc inverse défait un envoi.
Avec des capacités entières, Ford-Fulkerson ne pousse que des quantités entières : chaque arc porte 0 ou 1, et un flot de valeur correspond exactement à un couplage de taille . La capacité 1 sur les arcs de la source garantit qu'un candidat n'est pris qu'une fois, et celle sur les arcs du puits qu'un poste n'est pourvu qu'une fois.
Le flot maximal donne donc le couplage maximum, sans écrire un algorithme de plus.
Un quatrième candidat, David, ne vise lui aussi que Base, et un quatrième poste, Support, s'ouvre, qu'Ana accepterait. Quatre candidats pour quatre postes : le compte global ne dit rien, et pourtant le couplage maximum ne dépasse pas 3. On peut le prouver.
Trait épais : le couplage. Contour tireté : sans affectation. Cliquer une arête pour la prendre ou la rendre.
Couplage de taille 3 : Ana-Reseau, Bruno-Base, Chloe-Web.
Sans poste : David. Vacant : Support.
Dans un graphe biparti de parts (les candidats) et (les postes), il existe un couplage qui place tous les candidats si et seulement si, pour tout sous-ensemble , les candidats de visent ensemble au moins postes différents.
Ici donne et un seul poste visé, Base. La condition est violée, donc aucun couplage ne place les quatre. Le sens facile du théorème se comprend tout de suite : si un groupe vise moins de postes qu'il ne compte de personnes, quelqu'un restera sans poste. Le théorème dit que c'est le seul obstacle possible.
Revenir au départ et donner plutôt Web à David : le certificat à deux candidats tombe, et la figure en trouve un autre, Bruno, David et Chloe, trois candidats pour deux postes, Base et Web.
C'est la troisième fois que le parcours rencontre cette forme d'argument, après « clique et coloration » et « flot et coupe ». À chaque fois, une borne d'un côté, un objet qui l'atteint de l'autre, et la question est close.
Le programme ci-dessous n'est pas un algorithme de plus : c'est Ford-Fulkerson, écrit directement sur les candidatures. Chercher un poste pour un candidat, quitte à déplacer l'occupant vers un autre poste qu'il accepte, c'est chercher un chemin augmentant dans le réseau à capacités 1 ; déplacer l'occupant, c'est emprunter un arc inverse. On lui donne parfois, à tort, le nom d'algorithme hongrois : la méthode hongroise (Kuhn, 1955) résout une autre question, l'affectation où chaque paire candidat-poste a un coût, et où l'on cherche le couplage parfait le moins cher.
Comme la coupe à la fin du flot, le témoin de Hall sort de l'algorithme sans rien énumérer. Depuis un candidat resté sans poste, on regarde les postes qu'il vise, puis les candidats qui les occupent, puis les postes que visent ces derniers, et ainsi de suite. Tous ces postes sont occupés : un poste libre atteint de cette façon donnerait un chemin augmentant, et le couplage, qui est maximum, aurait pu grandir. Chacun l'est par un candidat du groupe : le groupe compte donc un candidat de plus que de postes visés.
C'est court, vérifiable, et définitif. C'est encore la même structure d'argument : un certificat plutôt qu'une exploration.
Quatre candidats ne visent que deux postes. Que conclure ?
Mettre en pratique
Pourquoi le graphe résiduel contient-il des arcs inverses ?
Pour permettre à l'algorithme de revenir sur une décision antérieure.
Sans arc inverse, un premier chemin augmentant mal choisi peut saturer une conduite dont une autre route aurait eu davantage besoin, et l'algorithme s'arrête sur un flot non maximal.
L'arc inverse, de capacité égale au flot déjà passé, permet à un chemin ultérieur de « rendre » ce flot pour le réorienter. Le flot reste valide à chaque étape, et la correction de l'algorithme en dépend entièrement.
Comment prouver qu'un flot est maximal, sans refaire tourner l'algorithme ?
En exhibant une coupe de capacité égale à la valeur du flot.
Toute quantité allant de la source au puits traverse toute coupe, donc la valeur d'un flot est toujours inférieure ou égale à la capacité de toute coupe. Si les deux nombres coïncident, aucun des deux ne peut être amélioré.
C'est le théorème flot-max coupe-min, et c'est un certificat vérifiable en quelques additions.
Comment ramener un couplage biparti à un problème de flot ?
On ajoute une source reliée à tous les sommets de gauche, un puits relié à tous ceux de droite, on oriente les arêtes existantes de gauche à droite, et l'on met la capacité 1 partout.
Les capacités unitaires sur les arcs de la source empêchent un candidat d'être pris deux fois, celles sur les arcs du puits empêchent un poste d'être pourvu deux fois.
Avec des capacités entières, Ford-Fulkerson ne pousse que des quantités entières : chaque arc porte 0 ou 1, un flot de valeur correspond alors exactement à un couplage de arêtes, et le flot maximal donne le couplage maximum.
Quatre candidats ne visent que deux postes. Que peut-on conclure ?
Qu'aucun couplage ne peut les placer tous les quatre, par le théorème de Hall : un sous-ensemble de 4 candidats n'a que 2 voisins, ce qui viole la condition.
Au mieux, deux d'entre eux obtiendront un poste.
Ce sous-ensemble est le certificat : il prouve l'impossibilité en une phrase, là où énumérer les affectations possibles serait long et peu convaincant.
Pourquoi choisir le plus court chemin augmentant ?
Pour garantir la terminaison et une bonne complexité.
Ford-Fulkerson avec un choix quelconque peut, sur des capacités mal choisies, effectuer un nombre d'itérations proportionnel à la valeur du flot, donc dépendant des nombres et non de la taille du graphe. Avec des capacités irrationnelles, il peut même ne pas terminer.
En prenant systématiquement le plus court chemin par un BFS, variante Edmonds-Karp, le nombre d'itérations est borné par , indépendamment des capacités.
Quel rapport entre ce chapitre et le chapitre sur la coloration ?
La structure de preuve.
Dans les deux cas, on encadre une quantité par deux côtés : une clique, ou à défaut un cycle impair, minore le nombre chromatique, une coloration le majore ; une coupe majore le flot, un flot la minore.
Quand les deux se rejoignent, l'optimalité est démontrée, et la preuve tient en un objet exhibé plutôt qu'en un raisonnement sur l'algorithme.
C'est une forme d'argument, la dualité, qui dépasse largement la théorie des graphes : on la retrouve en programmation linéaire, dont le théorème flot-max coupe-min est un cas particulier. Du côté de la coloration, l'égalité n'est d'ailleurs pas garantie : n'a aucune clique de taille 3, et il faut pourtant trois couleurs.
Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?
Dans la bibliothèque d'exercices
La coupe qui certifie un flot maximal, et le sommet où la conservation se perd.
- La coupe qui certifie le flotNiveau 3
- Deux sommets où le compte ne tombe pas justeNiveau 2
- Le graphe résiduel du centre de triNiveau 3
- L'astreinte du week-endNiveau 2
- Des relevés de débitmètres qui forment un flotNiveau 3
- Des chauffeurs et des véhicules, en réseau de flotNiveau 3