# Algorithme de Stoer-Wagner

En théorie des graphes, l'algorithme de Stoer-Wagner est un algorithme récursif déterministe pour trouver la coupe minimale dans des graphes non orientés pondérés, avec des poids positifs. Autrement dit, il s'agit de séparer le graphe en deux morceaux non vides, de telle sorte que la somme des poids attribués aux arêtes reliant un sommet d'un des morceaux à un sommet de l'autre soit la plus petite possible. L'algorithme a été proposé en 1994 par Mechthild Stoer et Frank Wagner lors d'un symposium européen à Utrecht$^,$. L'idée essentielle est de réduire progressivement la taille du graphe à considérer, en fusionnant des sommets par paire, jusqu'à ce que le graphe ne contienne que deux ensembles de sommets combinés. À chaque étape, l'algorithme choisit deux sommets $s$ et $t$, calcule la coupe minimale qui les sépare, puis (récursivement) la coupe minimale du graphe obtenu en les fusionnant, et renvoie le minimum des deux.

## Principe de l'algorithme de Stoer – Wagner

On considère un graphe non orienté pondéré $G=(V,E,w)$ : $V$ est l'ensemble des sommets, $E$ celui des arêtes entre les sommets et $w$ la fonction de valuation qui associe des nombres (les « poids ») aux arêtes. Une coupe est une partition des sommets du graphe en deux parties, deux sous-ensembles non-vides $A$ et $B$. Le poids de cette coupe est alors la somme des poids des arêtes qui relient un sommet de $A$ à un sommet de $B$. Une coupe minimale est une coupe de poids minimum ; elle n'est pas unique en général.
Considérons alors deux sommets quelconques, $s$ et $t$, de $V$. L'algorithme repose sur l'alternative suivante : soit une coupe minimale sépare $s$ et $t$ (c'est-à-dire que les deux sommets ne sont pas dans la même partie de la coupe), soit on peut l'obtenir à partir d'une coupe minimale d'un graphe ayant moins de sommets que le graphe initial.
Si en effet $s$ et $t$ sont dans la même partie, alors on peut construire un graphe ${\tilde {G}}(V\backslash \{s,t\}\cup st,{\tilde {E}},{\tilde {w}})$ dans lequel on a fusionné les sommets $s$ et $t$ en un seul sommet $st$. S'il y avait une arête $(s,t)$ entre $s$ et $t$ dans le graphe initial, elle est retirée ; pour tout autre sommet $u$, on crée une arête du nouveau graphe, $(u,st)$, entre le sommet $u$ et le nouveau sommet $st$ ; on attribue à cette arête un poids qui est la somme des poids des arêtes $(u,s)$ et de $(u,t)$ entre les sommets $u$ et $s$, ou $u$ et $t$, du graphe initial (on utilise 0 lorsqu'il n'existait pas d'arête entre ces sommets). La coupe minimale de ${\tilde {G}}$ a alors exactement le même poids que la coupe minimale du graphe initial $G$, et on peut repasser de l'une à l'autre (en remplaçant le sommet $st$ par les deux sommets $s$ et $t$).
On note également que, dans le cas général, la coupe minimale de ${\tilde {G}}$ a le même poids qu'une certaine coupe de $G$ ; ce poids est donc supérieur ou égal au poids d'une coupe minimale de $G$. Le graphe ${\tilde {G}}$ possède un sommet de moins que le graphe $G$. Par ailleurs, si ${\tilde {G}}$ ne possède que deux sommets, alors sa coupe minimale est obtenue trivialement en séparant ces deux sommets.
L'algorithme consiste alors à déterminer deux sommets $s$ et $t$ et une coupe minimale séparant $s$ et $t$, et à stocker le minimum entre cette coupe et la coupe minimale de ${\tilde {G}}$, calculée récursivement.

## Détermination de s et t

Comme cette méthode fonctionne pour tout couple $(s,t)$, l'algorithme de Stoer-Wagner choisit un couple $(s,t)$ tel que la coupe minimale séparant $s$ et $t$ soit rapide à déterminer.
Stoer et Wagner proposent d'initialiser le processus avec un ensemble $A$ composé d'un seul sommet quelconque $a$, par exemple de plus grand poids total, puis d'ajouter à $A$ le sommet le plus relié à $a$ (autrement dit, tel que la somme des poids des arêtes de ce sommet à $a$ soit maximale), puis le sommet le plus relié aux sommets déjà dans $A$, et ainsi de suite. Ils montrent que si on appelle les deux derniers sommets ajoutés $s$ et $t$, alors une coupe minimale séparant $s$ et $t$ est celle formée de tous les sommets sauf $t$ d'un côté et de $t$ de l'autre.

## Pseudo-code

On peut présenter le procédé ainsi :

## Complexité

Si $n$ est le nombre de sommets du graphe et $m$ le nombre d'arêtes, le temps de calcul est de l'ordre de $O(nm+n^{2}\log n)$.