Graphe - Arbre Couvrant Minimal
Un arbre couvrant d'un graphe est un ensemble d'arêtes pour lequel est un arbre. Si l'on suppose que le graphe est pondéré, c'est à dire est muni d'une fonction qui associe à toute arête un réel positif appelé son poids, un arbre couvrant est dit si son poids, , est au plus égal au poids de tout arbre couvrant. Le problème de l'arbre couvrant minimal (ACM) est alors
ACM
ENTREE : un graphe G non orienté connexe
SORTIE : un arbre convrant minimal de G
La résolution de ce problème repose sur la définition suivante
Définition :
Une coupure d'un graphe est un couple partitionnant
l'ensemble des sommets, c'est à dire un couple de la forme avec
. Une arête traverse la coupure
si l'un des extrémités est dans et l'autre non. Une coupure
respecte un ensemble d'arêtes si aucune arête ne traverse la coupure.
fonction Acm(G:graphe):ensemble d'aretes
retourner AcmRecursif(G,0)
fonction AcmRecurif(G:graphe, D:ensemble d'aretes): ensemble d'aretes
si D est un arbre courvrant de G
retourner D
sinon
choisir une coupure (P,V_G-P) respectant D et une arete e de poids minimal traversant (P,V_G-P)
retourner AcmRecursif(G,D u {e})
Algorithme Krustal
L'implémentation de l'ACM itératif par Krustal consiste à choisir une arête de poids minimal parmi toutes celles qui traversent une coupe respectant les arêtes déjà choisies, c'est à dire choisir une arête qui ne crée pas un cycle dans la solution courante.
fonction Acm-Krustal(G:graphe):ensemble d'arêtes
trier l'ensemble des arêtes E_G par poids croissant
D = 0
pour chaque arête e pris par poids croissant
si D u {e} est acyclique alors
D = D u {e}
retourner D
Algorithme Prim
L'algorithme Prim construit une coupure et un ensemble de telles sorte qu'à chaque instant l'ensemble acyclique connecte les sommets de en un arbre et laisse chacun des sommets de isolés. L'arbre couvrant minimal de sera représenté à l'aide d'une fonction père qui associe à tout sommet, sauf un (la racine), un sommet. Pour choisir rapidement une arête traversant de poids minimal on fait en sorte qu'à chaque instant
- l'arête soit une arête de poids minimal à traverser la coupe
- on connaisse le poids de cette arête. C'est l'objet de la fonction clé(x)
fonction Acm-Prim(G:graphe pondéré): fonction V_G -> V_G
clé = tableau indicé par V_G initialisé à l'infini
père = tableau indicé par V_G initialisé à NULL
P = V_G
choisir un sommet r dans V_G
clé[r] = 0
tant que non(estVide(P)) faire
extraire de P un élément x de clé minimale
pour chaque voisin y de x faire
si y dans P et poid(x,y) < clé(y) alors
clé[v] = poid(x,y)
père[y] = x
retourner père