Призначення сірого вузла в глибині першого графіка пошуку


19

У багатьох реалізаціях глибокого пошуку, який я бачив (наприклад: тут ), код розрізняє сіру вершину (виявлено, але не всі її сусіди були відвідані) і чорну вершину (виявлено і відвідали всіх її сусідів) . Яка мета цього розрізнення? Здається, що алгоритм DFS ніколи не відвідає відвідану вершину, незалежно від того, сіра вона чи чорна.

Відповіді:


26

Роблячи DFS, будь-який вузол знаходиться в одному з трьох станів - перед його відвідуванням, під час рекурсивного відвідування його нащадків і після відвідування всіх його нащадків (повернення до своєї батьківської, тобто фази завершення). Три кольори відповідають кожному з трьох станів. Однією з причин згадування кольорів та часу відвідування та повернення є чітке визначення цих відмінностей для кращого розуміння.

ГГА,Б,САББСАСАБСАС

У спрямованому графіку цикл присутній тоді і лише тоді, коли вузол буде показаний ще раз, перш ніж усі його нащадки були відвідані. Іншими словами, якщо у вузла є сусід, який є сірим, то існує цикл (а не тоді, коли сусід чорний). Сірий вузол означає, що ми зараз вивчаємо його нащадків - і якщо один такий нащадок має край цього сірого вузла, то існує цикл. Отже, для виявлення циклу у спрямованих графіках потрібно мати 3 кольори. Можуть бути й інші приклади, але ви повинні отримати ідею.


2
+1 хороше пояснення. Для простого обходу всього вузла в непрямому графіку (наприклад, пов'язаного в моєму питальному тілі), чи GREY і BLACK не мають функціональної різниці?
user6805

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

Я це зрозумів! Гаразд, розглянемо такий випадок: twitter.com/MaksimADmitriev/status/796995958043279361 Ми обводимо графіки за допомогою DFS. Графік зліва такий же, як і граф з цієї відповіді, і він не має циклів. Давайте обведемо графік праворуч, який має цикл. Ми відвідуємо А і відзначаємо його сірим кольором. Ми відвідуємо B і відзначаємо його сірим кольором. Ми відвідуємо C і відзначаємо його сірим кольором. Зараз ми збираємось відвідати A, який вже сірий. Тож "від чорного до чорного" не означає цикл, а "від сірого до сірого". Тому нам потрібен сірий. Виправте мене, якщо я помиляюся
Максим Дмитрієв

Для ще складніших цілей, таких як пошук сильно з’єднаних компонентів, можливо, потрібно буде записати два рази на кожен вузол: попередній час, коли вузол вперше знайдений (тобто час, коли він пофарбований у сірий колір), і час, коли вузол буде відвідуватися (тобто час, коли він пофарбований у чорний колір). Для реалізації записів підтримується лічильник, який збільшується в міру того, як відбувається кожна подія.
Іван

2

Це вправа в CLRS, що ви можете видалити сірий або чорний колір, і алгоритм відмінно працює лише з двома кольорами, іншими словами, він насправді не потрібен. Основна мета маркування вершин - переконатися, що ми не стикаємося з нескінченним циклом, неодноразово відвідуючи вже відвідані вершини.

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


0

Сіра вершина стверджує, що ви відвідали цей вузол і перейшли до одного з його сусідів у певному порядку, але може бути більше сусідніх вершин до цього вузла. Воно може бути корисним під час зворотного відстеження для вивчення невидимих ​​вершин.

Скажімо Vertex А має двох сусідів B і C і B має один сусід D .

починати з вершини А, що має білий колір і зробіть її сірим і переходьте до сусіда.

Скажімо, обираючи алфавітний порядок, він відвідує вершину B яка має білий колір і позначається сірим кольором.

Потім відвідує D білого -> сірого D -> більше немає сусідів. звідси позначає D-> чорний .

Тепер, зворотній зв'язок на B в сірому кольорі і більше немає ближніх. Звідси знаки B-> чорні .

AGain повертає A у сірому кольорі та відвідує c позначення c-> Grey більше не сусіди позначає C чорним

нарешті, повернемось до A і позначає вершину A такою ж чорною, як немає більше білих вершин і всі як чорні.


Я не бачу, чи має тут різниця між сірим та чорним ..
user6805

це те, що ти повинен зрозуміти. Якщо вершина позначена як чорна, це означає, що до неї не буде сусідніх вершин. Тут вершина D позначена чорним кольором, оскільки немає сусідських вершин .. де, як свідчить сірий, є більше сусідів для відвідування, а значить, ви проїдете їх.
NRK

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

0

У DFS класифікуємо краї як передні, задні, крайні та поперечні.

Для класифікації країв використовуємо 3 кольори. і ці кольори представляють стан вершини, тобто v. білий: вершина v ще не виявлена.

сірий: v вже виявлено, але всі вершини, до яких можна дістатися з v, ще не виявлені. тому вершина v все ще знаходиться в стеці.

чорний: v вже спливає з stack.discovered та закінчено.

Якщо у DFS ви стикаєтесь із сірою вершиною через край e, то це - зворотний край. Якщо ви стикаєтеся з чорною вершиною через край e, то це поперечний край / передній край. якщо ви стикаєтеся з білою вершиною, ви будете викликати DFS рекурсивно.


Гаразд, але в чому сенс? Ви сказали, що білий / сірий / чорний пов'язаний з вперед / назад / хрест / дерево, але ви також не говорите, для чого ці речі. Отож зараз є сім речей, які запитувач не розуміє, а не лише три!
Девід Річербі

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