Parcours Flashcards
(16 cards)
Parcours de graphe
Visite de tous les sommets accessibles depuis un sommet de départ donné
Comment parcourir un graphe
Marquage des sommets par des couleurs :
- Blanc = Pas encore visité
- Gris = En cours d’exploitation
- Noir = On a fini d’exploiter
Au début, le sommet de départ est gris et tous les autres sont blancs
A chaque étape, un sommet gris est sélectionné
Si tous ses voisins sont déjà gris ou noirs, alors il est colorié en noir
Sinon, il colorie un (ou plusieurs) de ses voisins blancs en gris
Jusqu’à ce que tous les sommets soient noirs ou blancs
Stockage des sommes gris dans un BFS
File (FIFO)
Stockage des sommes gris dans un DFS
Pile (LIFO)
Structure de données pour représenter l’arborescence
Tableau π tel que π[si ] = null si si est racine, et π[si ] = père de si sinon
BFS (Breadth First Search)
1 Fonction BFS(g, s0) 2 Soit f une file (FIFO) initialisée à vide 3 pour chaque sommet si de g faire 4 π[si ] ← null 5 Colorier si en blanc 6 Ajouter s0 dans f et colorier s0 en gris 7 tant que f n’est pas vide faire 8 Soit sk le sommet le plus ancien dans f 9 pour chaque si ∈ succ(sk ) tq si est blanc faire 10 Ajouter si dans f et colorier si en gris 11 π[si ] ← sk 12 Enlever sk de f et colorier sk en noir 13 retourne π
Complexité du BFS
O(n + p)
(sous réserve d’une implémentation par listes d’adjacence)
Que fait on quand on a le choix entre plusieurs sommets ?
On choisit le plus petit dans l’ordre lexicographique
Utilisations possibles d’un BFS
Recherche de plus courts chemins (en nombre d’arêtes)
Plus court chemin en nombre d’arêtes
Fonction calculeDistances(g, s0) 2 pour chaque sommet si de g faire 3 π[si ] ← null 4 Colorier si en blanc 5 d[si ] ← ∞ 6 Ajouter s0 dans f et colorier s0 en gris 7 d[s0] ← 0 8 tant que f n’est pas vide faire 9 Soit sk le sommet le plus ancien dans f 10 pour chaque si ∈ succ(sk ) tq si est blanc faire 11 Ajouter si dans f et colorier si en gris 12 d[si ] ← d[sk ] + 1 13 π[si ] ← sk 14 Enlever sk de f et colorier sk en noir 15 retourne d
DFS (Depth First Search)
1 Fonction DFS(g, s0) 2 Soit p une pile (LIFO) initialisée à vide 3 pour tout sommet si ∈ S faire 4 π[si ] ← null 5 Colorier si en blanc 6 Empiler s0 dans p et colorier s0 en gris 7 tant que p n’est pas vide faire 8 Soit si le dernier sommet entré dans p 9 si ∃sj ∈ succ(si ) tel que sj soit blanc alors 10 Empiler sj dans p et colorier sj en gris 11 π[sj ] ← si 12 sinon 13 Dépiler si de p et colorier si en noir 14 retourne π
Complexité du DFS
O(n + p)
(sous réserve d’une implémentation par listes d’adjacence)
DFS récursif
1 Proc DFSrec(g, s0) Entrée : Un graphe g et un sommet s0 Précond. : s0 est blanc 2 début 3 Colorier s0 en gris 4 pour tout sj ∈ succ(s0) faire 5 si sj est blanc alors 6 π[sj ] ← s0 7 DFSrec(g, sj ) 8 Colorier s0 en noi
Utilisations possibles du DFS
Détection de circuits
Numérotation des sommets
Tri topologique d’un DAG
Recherche des composantes fortement connexes
Tri topologique d’un DAG
Ordre total <_topo sur S tel que ∀(si , sj ) ∈ A, si <_topo sj
Après l’exécution de DFSnum, pour tout arc (si , sj ) ∈ A : num[sj ] < num[si ]
DAG
Graphe orienté sans circuit