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


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.