Licence Informatique Algorithmique des graphes 2019–2020
Parcours de graphes
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 :ParcoursProfondeurArbre(A) Entr´ees : un arbre binaire enracin´eA.
R´esultat : l’affichage des sommets deAsuivant un parcours en profondeur `a partir de la racine.
1 siA.racine()6=nil alors
2 afficher(A.racine());
3 ParcoursProfondeurArbre(A.sous arbre gauche());
4 ParcoursProfondeurArbre(A.sous arbre droit());
Algorithme 2 :ParcoursLargeurArbre(A) Entr´ees : un arbre enracin´eA.
Sortie : la liste des sommets de l’arbre ordonn´e selon un parcours en largeur `a partir de la racine.
1 a traiter ←file();
2 r´esultat←liste();
3 a traiter.enfiler(A.racine());
4 tant quea traiter.pas vide() faire
5 sommet←a traiter.d´efiler();
6 r´esultat.ajouter en fin(sommet);
7 pour chaquedescendant dansA.successeurs(sommet)faire
8 a traiter.enfiler(descendant);
9 renvoyer r´esultat;
Algorithme 3 :ParcoursProfondeurIt´eratif(G, d´epart, d´ej`a visit´es=nil)
Entr´ees : un graphe non-orient´eGet un sommet de d´epart; ´eventuellement, un tableau d´ej`a visit´es de|V|cases indiquant les sommets d´ej`a trait´es.
Sortie : les sommets deGaccessibles depuis le d´epart dans l’ordre o`u le parcours en largeur les a d´ecouverts.
1 r´esultat←liste();
2 sid´ej`a visit´es = nil alorsd´ej`a visit´es←tableau(G.nombre sommets(),faux);
3 a traiter ←pile();
4 a traiter.empiler(d´epart);
5 tant quea traiter.pas vide() faire
6 sommet←a traiter.d´epiler();
7 si¬d´ej`a visit´es[sommet] alors
8 r´esultat.ajouter en fin(sommet);
9 d´ej`a visit´es[sommet]←vrai;
10 pour chaquevoisin dans renverser(G.voisins(sommet))faire
11 si¬d´ej`a visit´es[voisin] alors a traiter.empiler(voisin) ;
12 renvoyer r´esultat;
Page 1 / 4
Licence Informatique Algorithmique des graphes 2019–2020
Algorithme 4 :ParcoursLargeurIt´eratif(G, d´epart, d´ej`a visit´es=nil)
Entr´ees : un graphe non-orient´eGet un sommet de d´epart; ´eventuellement, un tableau d´ej`a visit´es de|V|cases indiquant les sommets d´ej`a trait´es.
Sortie : la liste des sommets deGaccessibles depuis le d´epart dans l’ordre o`u le parcours en largeur les a d´ecouverts.
1 r´esultat←liste();
2 sid´ej`a visit´es = nil alorsd´ej`a visit´es←tableau(G.nombre sommets(),faux);
3 a traiter ←file();
4 a traiter.enfiler(d´epart);
5 tant quea traiter.pas vide() faire
6 sommet←a traiter.d´efiler();
7 si¬d´ej`a visit´es[sommet] alors
8 r´esultat.ajouter en fin(sommet);
9 d´ej`a visit´es[sommet]←vrai;
10 pour chaquevoisin dans G.voisins(sommet) faire
11 si¬d´ej`a visit´es[voisin] alors a traiter.enfiler(voisin) ;
12 renvoyer r´esultat;
Algorithme 5 :ParcoursG´en´erique(G,S, d´epart, d´ej`a visit´es=nil)
Entr´ees : un graphe non-orient´eG, une structure de donn´eesS suppos´ee vide et un sommet de d´epart.
Sortie : les sommets deGaccessibles depuis le d´epart dans l’ordre impos´e par la structureS.
1 r´esultat←liste();
2 sid´ej`a visit´es = nil alorsd´ej`a visit´es←tableau(G.nombre sommets(),faux);
3 S.ins´erer(d´epart);
4 tant queS.pas vide() faire
5 sommet←S.extraire();
6 si¬d´ej`a visit´es[sommet] alors
7 r´esultat.ajouter en fin(sommet);
8 d´ej`a visit´es[sommet]←vrai;
9 pour chaquevoisin dans G.voisins(sommet) faire
10 si¬d´ej`a visit´es[voisin] alors S.ins´erer(voisin) ;
11 renvoyer r´esultat;
Algorithme 6 :EstConnexe(G) Entr´ees : un graphe non orient´eG.
Sortie : vraisiGest connexe,fauxsinon.
1 siG.nombre sommets() = 0 alors // on suppose le graphe vide connexe
2 renvoyer vrai;
3 d´epart←sommet arbitraire deG;
4 renvoyer |ParcoursLargeurIt´eratif(G, d´epart)|=|V|;
Page 2 / 4
Licence Informatique Algorithmique des graphes 2019–2020
Algorithme 7 :ComposantesConnexes(G) Entr´ees : un graphe non orient´eG.
Sortie : les composantes connexes deG, identifi´ees par la liste de leurs sommets.
1 r´esultat←liste();
2 d´ej`a visit´es←tableau(G.nombre sommets(),faux);
3 pour chaquesommet∈V(G)faire
4 si¬d´ej`a visit´es[sommet] alors
5 r´esultat.ajouter en fin(ParcoursLargeurIt´eratif(G, sommet, d´ej`a visit´es))
6 renvoyer r´esultat;
Algorithme 8 :EstBiparti(G) Entr´ees : un graphe connexe G.
Sortie : vraisiGest biparti,fauxsinon.
1 siG.nombre sommets() = 0 alors renvoyervrai;
2 couleurs ←tableau(G.nombre sommets(),−1);
3 couleur actuelle←vrai;
4 d´epart←sommet arbitraire deG;
5 a traiter ←file();
6 a traiter.enfiler(d´epart);
7 couleurs[d´epart]←couleur actuelle;
8 tant quea traiter.pas vide() faire
9 sommet←a traiter.d´efiler();
10 couleur actuelle← ¬couleurs[sommet];
11 pour chaquevoisin de sommet faire
12 sicouleurs[voisin] 6=couleur actuelle alors renvoyerfaux;
13 sicouleurs[voisin] =−1alors
14 couleurs[voisin]←couleur actuelle;
15 a traiter.enfiler(voisin);
16 renvoyer vrai;
Algorithme 9 :ContientCycle(G) Entr´ees : un graphe non orient´eG.
Sortie : vraisiGcontient un cycle,fauxsinon.
1 pour chaqueC∈ComposantesConnexes(G)faire
2 H ←G.sous graphe induit(C);
3 siH.nombre aretes()≥H.nombre sommets() alors renvoyervrai;
4 renvoyer faux;
Page 3 / 4
Licence Informatique Algorithmique des graphes 2019–2020
Algorithme 10 :D´etecterCycleProfondeur(G, d´epart)
Entr´ees : un graphe connexe non-orient´eGet un sommet de d´epart.
Sortie : un cycle de G, ounil siGest acyclique.
1 d´ej`a visit´es←tableau(G.nombre sommets(),faux);
2 parents←tableau(G.nombre sommets(),nil);
3 a traiter ←pile();
4 a traiter.empiler(d´epart);
5 tant quea traiter.pas vide() faire
6 sommet←a traiter.d´epiler();
7 si¬d´ej`a visit´es[sommet] alors
8 d´ej`a visit´es[sommet]←vrai;
9 pour chaquevoisin dans renverser(G.voisins(sommet))faire
10 si¬d´ej`a visit´es[voisin] alors
11 siparents[voisin] = nilalors// sommet jamais vu ⇒ `a traiter
12 a traiter.empiler(voisin);
13 parents[voisin]←sommet;
14 sinon // sommet d´ej`a accessible autrement
15 cycle←Graphe();
16 ancien parent←parents[voisin];
17 cycle.ajouter arˆete(sommet, voisin);
18 cycle.ajouter arˆete(voisin, ancien parent);
19 tant quesommet 6=ancien parent faire// remonter l’autre chemin
20 cycle.ajouter arˆete(sommet, parents[sommet]);
21 sommet←parents[sommet];
22 renvoyer cycle;
23 renvoyer nil;
Page 4 / 4