Назначение серого узла в графе поиска в глубину


19

Во многих реализациях поиска в глубину, который я видел (например: здесь ), код различает серую вершину (обнаружена, но не все ее соседи были посещены) и черную вершину (обнаружена и все ее соседи посещены) , Какова цель этого различия? Кажется, что алгоритм DFS никогда не посещает посещенную вершину, независимо от того, является ли она серой или черной.

Ответы:


26

При выполнении DFS любой узел находится в одном из трех состояний - до посещения, во время рекурсивного посещения его потомков и после посещения всех его потомков (возврат к своему родителю, т. Е. Фаза завершения). Три цвета соответствуют каждому из трех состояний. Одна из причин упоминания цветов и времени посещения и возвращения заключается в том, чтобы четко определить эти различия для лучшего понимания.

Конечно, есть фактическое использование этих цветов. Рассмотрим ориентированный граф . Предположим, вы хотите проверить на наличие циклов. В неориентированном графе, если рассматриваемый узел имеет черного или серого соседа, он указывает цикл (и DFS не посещает его, как вы упомянули). Однако в случае ориентированного графа черный сосед не означает цикл. Например, рассмотрим граф с вершинами 3 - и , с ориентированными ребрами , как , , . Предположим , что начинается DFS на , а затем посещена , то . Когда он вернулся вграммGA,B,CABBCACABCA он проверяет, что уже посещен и является черным. Но на графике нет цикла.С

На ориентированном графе цикл присутствует тогда и только тогда, когда узел снова виден до посещения всех его потомков. Другими словами, если у узла есть сосед, который является серым, то существует цикл (а не когда сосед является черным). Серый узел означает, что мы в настоящее время исследуем его потомков - и если один такой потомок имеет ребро к этому серому узлу, то существует цикл. Итак, для обнаружения цикла в ориентированных графах вам нужно иметь 3 цвета. Могут быть и другие примеры, но вы должны понять.


2
+1 хорошее объяснение. Для простого обхода всех узлов в неориентированном графе (например, связанном в моем теле вопроса), не имеют ли СЕРЫЙ и ЧЕРНЫЙ функциональных различий?
user6805

1
@ user6805 Для простого обхода - посещения каждого узла - как направленного, так и неориентированного графа, функциональная разница между серым и черным отсутствует. Вы можете использовать только два цвета (или посещенные / не посещенные). Для более сложных алгоритмов вам нужны цвета.
Пареш

Это я понял! Хорошо, рассмотрим следующий случай: twitter.com/MaksimADmitriev/status/796995958043279361 Мы просматриваем графики, используя DFS. График слева такой же, как график из этого ответа, и он не имеет циклов. Давайте пройдемся по графику справа, который имеет цикл. Мы посещаем А и отмечаем серым. Мы посещаем B и отмечаем его серым. Мы посещаем C и отмечаем его серым. Теперь мы собираемся посетить А, который уже серый. Таким образом, «от черного к черному» не означает, что существует цикл, а «от серого к серому». Вот почему нам нужен серый. Пожалуйста, поправьте меня, если я ошибаюсь
Максим Дмитриев

Для еще более сложных целей, таких как поиск сильно связанных компонентов, может потребоваться запись два раза для каждого узла: до времени, когда узел впервые найден (т. Е. Когда он окрашен в серый цвет), и после времени, когда узел завершает посещение. (т. е. время окрашено в черный цвет). Для реализации записей поддерживается счетчик, который увеличивается при каждом событии.
Джон

2

В CLRS это упражнение, в котором вы можете удалить серый или черный цвет, и алгоритм отлично работает только с двумя цветами, другими словами, он на самом деле не нужен. Основная цель маркировки вершин - убедиться, что мы не сталкиваемся с бесконечным циклом, повторно посещая уже посещенные вершины.

Причина использования трех цветов в алгоритме DFS в основном педагогическая: она концептуально понятнее, она помогает учащимся увидеть, что происходит во время выполнения для каждого узла.


0

Серая вершина утверждает, что вы посетили этот узел и перешли к одному из его соседей в некотором порядке, но может быть больше соседних вершин к этому узлу. Это будет полезно при поиске в обратном направлении для изучения не посещенных вершин.

Скажем Vertex А имеет двух соседей B и C и B имеет один сосед D .

начните с вершины A, которая имеет белый цвет, и сделайте ее серой и перейдите к соседу.

Допустим, выбрав алфавитный порядок, он посещает вершину B, которая имеет белый цвет и помечается как серый.

Затем посещение D белого -> серого D -> больше нет соседей. следовательно помечает D-> черный .

Теперь вернемся к B в сером и больше не nieghbors. Отсюда отметки B-> черные .

AG снова возвращает A в сером цвете и посещает c, отмечая c-> Grey, соседи больше не отмечают C как черный

наконец, вернемся к A и пометим вершину A черным, поскольку белых вершин больше нет и все будет черным.


Я не вижу, имеет ли здесь какое-то значение различие между серым и черным ..
user6805

это то, что вы должны понять. Если вершина помечена как черная, это означает, что к этой вершине не будет соседних вершин. Здесь вершина D помечена черным, так как соседних вершин нет ... где, как предполагает серый, есть больше соседей, которые нужно посетить, и, следовательно, вы проходите через них.
NRK

Я считаю, что это избавляет вас от простого повторного посещения узлов, которые, как вы знаете, наверняка не имеют задних граней (то есть оптимизации)
Сетерон

0

В DFS мы классифицируем ребра как передний край, задний край, поперечный край и край дерева.

Мы используем 3 цвета, чтобы классифицировать края. и эти цвета представляют состояние вершины, т.е. v. white: вершина v еще не обнаружена.

серый: v уже был обнаружен, но все вершины, которые достижимы из v, еще не обнаружены. поэтому вершина v все еще находится в стеке.

черный: v уже выпал из стека. обнаружен и закончен.

При выполнении DFS, если вы сталкиваетесь с серой вершиной через ребро e, то это задний край. Если вы сталкиваетесь с черной вершиной через ребро e, то это перекрестная кромка / передняя кромка. если вы встретите белую вершину, то вы будете вызывать DFS рекурсивно.


ОК, но какой в ​​этом смысл? Вы сказали, что белый / серый / черный относится к вперед / назад / кресту / дереву, но вы также не говорите, для чего эти вещи. Так что теперь есть семь вещей, которые аскер не понимает, а не только три!
Дэвид Ричерби

Эти ребра могут использоваться в различных приложениях DFS, например, задние ребра используются при идентификации петель в графе, Прямые и поперечные ребра используются для проверки наличия уникального пути между каждой парой вершин.
Нирадж Сингх,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.