Licence Informatique Algorithmique des graphes 2019–2020
Graphes pond´er´es
Ce document reprend les algorithmes vus au cours. Par convention, ils sont impl´ement´es sous la forme de fonctions avec un nom utilisantcette police. Si vous la voyez apparaˆıtre dans un algorithme, cela signifie donc qu’on fait appel `a un autre algorithme d´ej`a vu.
Algorithme 1 :StockerAretesValides(G,u, S, hors arbre)
Entr´ees : un graphe pond´er´e non orient´eG, un sommetudeG, un tas d’arˆetesS et un tableau bool´een hors arbre.
R´esultat : les arˆetes valides incidentes `a usont ajout´ees `aS.
1 pour chaquev∈G.voisins(u) faire
2 sihors arbre[v] alors S.ins´erer((u,v,G.poids arˆete(u,v))) ;
Algorithme 2 :ExtraireAreteSure(S, hors arbre)
Entr´ees : un tasS d’arˆetes et un tableau bool´een hors arbre.
R´esultat : une arˆete sˆure (ou factice s’il n’y en a pas) est extraite deS et renvoy´ee; les arˆetes invalides ´eventuellement rencontr´ees sont ´elimin´ees.
1 tant queS.pas vide() faire
2 (u, v, p)←S.extraire minimum();
3 sihors arbre[u]6=hors arbre[v] alors renvoyer(u, v, p) ;
4 renvoyer (nil,nil, +∞);
Algorithme 3 :Prim(G, d´epart)
Entr´ees : un graphe pond´er´e non orient´eG, un sommet de d´epart.
Sortie : un ACPM pour la composante connexe deGcontenant d´epart.
1 arbre ←GraphePond´er´e();
2 arbre.ajouter sommet(d´epart);
3 hors arbre←tableau(G.nombre sommets(),vrai);
4 hors arbre[d´epart]←faux;
5 candidates←Tas() ;
6 StockerAretesValides(G, d´epart, candidates, hors arbre) ;
7 tant quearbre.nombre aretes() < G.nombre sommets() - 1 faire
8 (u, v, p)←ExtraireAreteSure(candidates, hors arbre) ;
9 siu= nilalors renvoyerarbre ;
10 sihors arbre[u] alors´echangeruetv;
11 arbre.ajouter arˆete(u,v,p);
12 hors arbre[u]←faux;
13 StockerAretesValides(G,u, candidates, hors arbre) ;
14 renvoyer arbre;
Page 1 / 2
Licence Informatique Algorithmique des graphes 2019–2020
Algorithme 4 :Kruskal(G)
Entr´ees : un graphe pond´er´e non orient´eG.
Sortie : une forˆet couvrante de poids minimum pourGconsistant en un arbre couvrant de poids minimum pour chaque composante connexe deG.
1 forˆet ←GraphePond´er´e(G.sommets());
2 classes←UnionFind(G.sommets()) ;
3 pour chaque(u,v,p)∈ tri par poids croissant(G.arˆetes())faire
4 siclasses.find(u) 6=classes.find(v) alors
5 forˆet.ajouter arˆete(u,v,p);
6 classes.union(classes.find(u), classes.find(v));
7 renvoyer forˆet;
Algorithme 5 :ExtraireSommetLePlusProche(S, distances)
Entr´ees : un ensembleS de sommets, et la distance de chaque sommet de S.
R´esultat : le sommet de S le plus proche est extrait et renvoy´e.
1 sommet←nil;
2 distance min←+∞;
3 pour chaquecandidat∈S faire
4 sidistances[candidat] <distance min alors
5 sommet←candidat;
6 distance min←distances[candidat];
7 sisommet6=nil alors S←S\ sommet ;
8 renvoyer sommet;
Algorithme 6 :Dijkstra(G, source)
Entr´ees : un graphe pond´er´e non orient´eG, un sommet source.
Sortie : la longueur d’un plus court chemin de la source `a chacun des sommets du graphe (+∞
pour les sommets non accessibles).
1 a traiter ←G.sommets();
2 distances ←tableau(G.nombre sommets(), +∞);
3 distances[source] ←0;
4 tant quea traiter.pas vide() faire
5 u←ExtraireSommetLePlusProche(a traiter, distances);
6 siu=nil alors renvoyerdistances ;
7 pour chaquev∈G.voisins(u) faire
8 distances[v] ←min(distances[v], distances[u] +G.poids arˆete(u,v));
9 renvoyer distances;
Page 2 / 2