Le but du nœud gris dans la recherche en profondeur du graphique


19

Dans de nombreuses implémentations de recherche en profondeur d'abord que j'ai vues (par exemple: ici ), le code fait la distinction entre un sommet gris (découvert, mais pas tous ses voisins ont été visités) et un sommet noir (découvert et tous ses voisins ont été visités) . Quel est le but de cette distinction? Il semble que l'algorithme DFS ne visitera jamais un sommet visité, qu'il soit gris ou noir.

Réponses:


26

Lorsque vous effectuez un DFS, n'importe quel nœud se trouve dans l'un des trois états - avant d'être visité, lors de la visite récursive de ses descendants et après que tous ses descendants ont été visités (retour à son parent, c'est-à-dire phase de récapitulation). Les trois couleurs correspondent à chacun des trois états. L'une des raisons de mentionner les couleurs et l'heure de la visite et du retour est de faire explicitement ces distinctions pour une meilleure compréhension.

Bien sûr, il existe des utilisations réelles de ces couleurs. Considérons un graphe orienté . Supposons que vous vouliez vérifier G pour l'existence de cycles. Dans un graphique non orienté, si le nœud considéré a un voisin noir ou gris, il indique un cycle (et le DFS ne le visite pas comme vous le mentionnez). Toutefois, en cas d'un dirigé graphique, un voisin noir ne signifie pas un cycle. Par exemple, considérons un graphe avec 3 sommets - A , B , et C , avec des bords dirigés comme A B , B C , A C . Supposons que le DFS commence à AggUNE,B,CUNEBBCUNECUNE, Puis visites , puis C . Lorsqu'il est revenu à A , il vérifie alors que C a déjà été visité et qu'il est noir. Mais il n'y a pas de cycle dans le graphique.BCUNEC

Dans un graphe orienté, un cycle est présent si et seulement si un nœud est revu avant que tous ses descendants aient été visités. En d'autres termes, si un nœud a un voisin qui est gris, alors il y a un cycle (et pas quand le voisin est noir). Un nœud gris signifie que nous explorons actuellement ses descendants - et si l'un de ces descendants a un bord avec ce nœud gris, alors il y a un cycle. Ainsi, pour la détection de cycle dans les graphiques dirigés, vous devez avoir 3 couleurs. Il pourrait aussi y avoir d'autres exemples, mais vous devriez avoir l'idée.


2
+1 bonne explication. Pour une traversée simple de tous les nœuds dans un graphe non orienté (comme celui lié dans mon corps de question), GRIS et NOIR n'ont-ils aucune différence fonctionnelle?
user6805

1
@ user6805 Pour une traversée simple - visitant chaque nœud - du graphe orienté ou non, il n'y a pas de différence fonctionnelle entre le gris et le noir. Vous ne pouvez utiliser que deux couleurs (ou visité / non visité). C'est pour les algorithmes plus complexes que vous avez besoin de couleurs.
Paresh

Je l'ai compris! OK, considérons le cas suivant: twitter.com/MaksimADmitriev/status/796995958043279361 Nous parcourons les graphiques en utilisant DFS. Le graphique de gauche est le même que le graphique de cette réponse, et il n'a pas de cycles. Parcourons le graphique de droite qui a un cycle. Nous visitons A et le marquons en gris. Nous visitons B et le marquons en gris. Nous visitons C et le marquons en gris. Nous allons maintenant visiter A qui est déjà gris. Donc «du noir au noir» ne signifie pas qu'il y a un cycle, mais «du gris au gris». Voilà pourquoi nous avons besoin de gris. Veuillez me corriger si je me trompe
Maksim Dmitriev

À des fins encore plus complexes, comme la recherche de composants fortement connectés, il peut être nécessaire d'enregistrer deux fois pour chaque nœud: avant le premier moment où un nœud est trouvé (c'est-à-dire le moment où il est coloré en gris) et après le moment où un nœud a fini de visiter (c.-à-d. le moment où il est coloré en noir). Pour implémenter les enregistrements, un compteur est maintenu, qui augmente à chaque événement.
John

2

C'est un exercice dans CLRS que vous pouvez supprimer la couleur grise ou noire et l'algorithme fonctionne bien avec seulement deux couleurs, en d'autres termes, il n'est pas vraiment nécessaire. Le but principal du marquage des sommets est de s'assurer que nous ne tombons pas dans une boucle infinie en visitant à plusieurs reprises les sommets déjà visités.

La raison d'utiliser 3 couleurs dans l'algorithme DFS est principalement pédagogique: elle est conceptuellement plus claire, elle aide les étudiants à voir ce qui se passe pendant l'exécution pour chaque nœud.


0

Le sommet gris indique que vous avez visité ce nœud et que vous êtes passé à l'un de ses voisins dans un certain ordre, mais il pourrait y avoir plus de sommets voisins sur ce nœud. Il peut être utile lors du retour en arrière pour explorer des sommets non visités.

Disons que Vertex A a deux voisins B et C et B a un voisin D .

commencez au sommet A qui est de couleur blanche et rendez-le gris et passez à son voisin.

Disons qu'en choisissant l'ordre alphabétique, il visite le sommet B qui est de couleur blanche et marque en gris.

Puis visite D de blanc -> gris D -> plus de voisins. marque donc D-> noir .

Maintenant, revenons à B en gris et plus de ports. D'où les marques B-> noires .

AGain revient en arrière A en gris et visite la marque c à c-> Gris plus aucun voisin marque C comme noir

enfin, revenons à A et marque le sommet A comme noir car il n'y a plus de sommets blancs et tout comme noir.


Je ne vois pas si la distinction entre le gris et le noir est
utile

c'est ce que vous devez comprendre. Si un sommet est marqué en noir, cela signifie qu'il n'y aurait pas de sommets voisins à ce sommet. Ici, le sommet D est marqué en noir car il n'y a pas de sommets voisins .. où, comme le suggère le gris, il y a plus de voisins à visiter et donc vous les traversez.
NRK

Je crois que cela vous évite de simplement re-visiter des nœuds dont vous savez avec certitude qu'ils n'ont pas d'
arête

0

Dans DFS, nous classons les bords en tant que bord avant, bord arrière, bord transversal et bord d'arbre.

Nous utilisons 3 couleurs pour classer les bords. et ces couleurs représentent l'état du sommet c'est-à-dire v. blanc: le sommet v n'est pas encore découvert.

gris: v a déjà été découvert, mais tous les sommets accessibles depuis v ne sont pas encore découverts. donc le sommet v est toujours dans la pile.

noir: v est déjà sorti de la pile. Découvert et terminé.

En faisant le DFS si vous rencontrez un sommet gris à travers le bord e, alors c'est un bord arrière. Si vous rencontrez un sommet noir à travers le bord e, alors c'est un bord transversal / bord avant. si vous rencontrez un sommet blanc, vous appellerez récursivement DFS.


OK mais à quoi ça sert? Vous avez dit que le blanc / gris / noir est lié à l'avant / arrière / croix / arbre mais vous ne dites pas non plus à quoi servent ces choses. Alors maintenant, il y a sept choses que le demandeur ne comprend pas, au lieu de trois!
David Richerby

Ces bords peuvent être utilisés dans diverses applications de DFS, comme les bords arrière sont utilisés pour identifier les boucles dans un graphique, les bords avant et croisés sont utilisés pour tester si un chemin unique existe entre chaque paire de sommets.
Neeraj Singh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.