• Aucun résultat trouvé

Algorithme 2 :ParcoursLargeurArbre(A) Entr´ees : un arbre enracin´eA

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithme 2 :ParcoursLargeurArbre(A) Entr´ees : un arbre enracin´eA"

Copied!
4
0
0

Texte intégral

(1)

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.

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 esultatliste();

3 a traiter.enfiler(A.racine());

4 tant quea traiter.pas vide() faire

5 sommeta traiter.d´efiler();

6 esultat.ajouter en fin(sommet);

7 pour chaquedescendant dansA.successeurs(sommet)faire

8 a traiter.enfiler(descendant);

9 renvoyer 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 ecouverts.

1 esultatliste();

2 siej`a visit´es = nil alorsej`a visit´estableau(G.nombre sommets(),faux);

3 a traiter pile();

4 a traiter.empiler(d´epart);

5 tant quea traiter.pas vide() faire

6 sommeta traiter.d´epiler();

7 si¬ej`a visit´es[sommet] alors

8 esultat.ajouter en fin(sommet);

9 ej`a visit´es[sommet]vrai;

10 pour chaquevoisin dans renverser(G.voisins(sommet))faire

11 si¬ej`a visit´es[voisin] alors a traiter.empiler(voisin) ;

12 renvoyer esultat;

Page 1 / 4

(2)

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 esultatliste();

2 siej`a visit´es = nil alorsej`a visit´estableau(G.nombre sommets(),faux);

3 a traiter file();

4 a traiter.enfiler(d´epart);

5 tant quea traiter.pas vide() faire

6 sommeta traiter.d´efiler();

7 si¬ej`a visit´es[sommet] alors

8 esultat.ajouter en fin(sommet);

9 ej`a visit´es[sommet]vrai;

10 pour chaquevoisin dans G.voisins(sommet) faire

11 si¬ej`a visit´es[voisin] alors a traiter.enfiler(voisin) ;

12 renvoyer 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 epart.

Sortie : les sommets deGaccessibles depuis le d´epart dans l’ordre impos´e par la structureS.

1 esultatliste();

2 siej`a visit´es = nil alorsej`a visit´estableau(G.nombre sommets(),faux);

3 S.ins´erer(d´epart);

4 tant queS.pas vide() faire

5 sommetS.extraire();

6 si¬ej`a visit´es[sommet] alors

7 esultat.ajouter en fin(sommet);

8 ej`a visit´es[sommet]vrai;

9 pour chaquevoisin dans G.voisins(sommet) faire

10 si¬ej`a visit´es[voisin] alors S.ins´erer(voisin) ;

11 renvoyer 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 epartsommet arbitraire deG;

4 renvoyer |ParcoursLargeurIt´eratif(G, d´epart)|=|V|;

Page 2 / 4

(3)

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 esultatliste();

2 ej`a visit´estableau(G.nombre sommets(),faux);

3 pour chaquesommetV(G)faire

4 si¬ej`a visit´es[sommet] alors

5 esultat.ajouter en fin(ParcoursLargeurIt´eratif(G, sommet, d´ej`a visit´es))

6 renvoyer 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 actuellevrai;

4 epartsommet 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 sommeta 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 chaqueCComposantesConnexes(G)faire

2 H G.sous graphe induit(C);

3 siH.nombre aretes()H.nombre sommets() alors renvoyervrai;

4 renvoyer faux;

Page 3 / 4

(4)

Licence Informatique Algorithmique des graphes 2019–2020

Algorithme 10 :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 ej`a visit´estableau(G.nombre sommets(),faux);

2 parentstableau(G.nombre sommets(),nil);

3 a traiter pile();

4 a traiter.empiler(d´epart);

5 tant quea traiter.pas vide() faire

6 sommeta traiter.d´epiler();

7 si¬ej`a visit´es[sommet] alors

8 ej`a visit´es[sommet]vrai;

9 pour chaquevoisin dans renverser(G.voisins(sommet))faire

10 si¬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 cycleGraphe();

16 ancien parentparents[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 sommetparents[sommet];

22 renvoyer cycle;

23 renvoyer nil;

Page 4 / 4

Références

Documents relatifs

[r]

[r]

Nous d´ esirons transmettre un octet par protocole compatible RS232 en encodage 8E1 1 : proposer une proc´ edure qui g´ en` ere une s´ equence de signaux compatibles RS232,

Pour des queions, demande de pr´ecisions ou explications, n’h´esitez pas `a m’envoyer un mail `a igor.kortchemski@ens.fr , ou bien `a venir me voir au bureau

Que valent les sorties S et T en fonction des entr´ees A, B,

[r]

(a) II est basé sur la recherche de l'arbre de longueur minimum du graphe des données (on rappelle que l'arbre de longueur minimum d'un graphe dont les arêtes sont valuées, est

On reviendra sur les relations de similarité et de divisibilité entre les sous-résultants (elles sont déjà bien connues, voir les ouvrages précités ci-dessus) grâce à de