Обхід орієнтованого графа в глибину

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

Обхід в глибину орієнтованого графа

По суті, послідовність дій при глибинному обхід орієнтованого графа нічим не відрізняється від обходу неорієнтованого графа. Для того, щоб показати це, розглянемо деяки орієнтований граф , для якого, спочатку, всі вершини вважаються не пройденими, а ребра не перерглянутими. Пошук в глибину, починається з вибору початкової вершини . Відмітимо, що дана вершина після цього вважається пройденою. На наступному кроці, вибирається будь-яке не переглянуте, інцидентне вершині  орієнтоване ребро, наприклад (при цьому говорять, що  — початкова вершина ребра, а  — кінцева вершина). Якщо вершина  раніше не була пройдена, то використовуючи ребро  переходимо у вершину  і продовжуємо пошук з неї. Ребро  після цих дій вважається переглянутим і називається ребром дерева, а вершина  називається батьківською по відношенню до вершини . Якщо ж вершина  була раніше пройдена, то продовжуємо пошук іншого не пройденого ребра, інцидентного . В цьому випадку ребро  також вважається переглянутим і називається зворотним, прямим або поперечним ребром (яким чином розрізняють ці три типи ребер буде показано нижче).  Коли всі вершини, які можна досягти з вершини , будуть пройдені, пошук закінчується. Якщо, після цього, деякі вершини залишилися не пройденими, то вибирається одна з них і пошук повторюється. Цей процес триває до тих пір, поки всі вершини орграфа  не будуть пройденими.

Після того, як з алгоритмом розібрались, перейдемо до розгляду особливостей отриманого дерева обходу в глибину. Як уже зазначалося вище, в додаток до ребер дерева в ньому присутні ще три типи ребер. Це зворотні, прямі і поперечні ребра.

Зворотні ребра — це ребра, які в дереві обходву в глибину йдуть від нащадків до предків. Відмітимо, що ребро, яке прямує з вершини в саму себе також є зворотним ребром (на рисунку, що міститься вище, ребро являється зворотним). Прямими називаються ребра, що йдуть від предків до дійсних нащадків, але які не є ребрами дерева. На рисунку це ребра , і . Ребро , тобто таке, що з'єднює вершини, які не є ні предками, ні нащадками один одного, називаються поперечними ребрами.

Обхід орієнтованого графа в глибину — приклад:

Побудувати дерево пошуку в глибину для орієнтованого графа наступного вигляду:

poshuk_v_glybynu_o19

Орієнтований граф задачі

Для цього, на першому кроці, в якості початкової виберемо вершину номер «1». Відмітимо, що дане вершина після цього вважається пройденою. На наступному кроці, рухаємося по першому зустрічному не пройденому орієнтованому ребру, наприклад, . Виходячи з того, що вершина «2» ніколи раніше не відвідувалась, залишаємось в ній і проходимо по першому не пройденому для неї ребру, а саме . Для вершина «3» першим не пройденим ребром являється ребро . Проходимо його і виявляємо, що вершина «1» вже відвідувалась раніше. Тому повертаємось у «3» і помічаємо ребро як зворотне (пунктирною лінією).

Повернувшись у вершину «3», шукаємо інше не пройдене орієнтоване ребро. Оскільки для даної вершини таких ребер не залишилось, повертаємось у «2». Для вершини «2» виявляємо не пройдене ребро і проходимо його. Оскільки «4» — нова вершина, залишаємось в ній і шукаємо не прйдене інцидентне їй ребро. Вершини «1» і «3» зі списку суміжності вершини «4» вже відвідувались раніше. Тому, позначивши ребра та як пройдене зворотне та пройдене поперечне (пунктирною лінією темно сірого кольору) відповідно, пошук повертається спочатку у вершину «2», а потім у вершину номер «1», що свідчить про те, що обхід заданого орграфа в глибину можна вважати завершеним.

Побудова дерева обходу в глубину для орієнтованого графа

Але виходячи з того що серед його вершин містяться ще не пройдені, то вибравши одну з них, наприклад, вершину під номером «5», продовжимо обхід в глибину з неї. В результаті, для заданого орграфа, отримаємо наступне дерево пошуку в глибину (ребра  і  являються ребрами дерева, а ребра  і  — поперечними).

Дерево обходу в глубину для заданого орієнтованого графа

Блок-схема алгоритму обходу орієнтованого графа в глибину

Матеріал був корисним, поділись в соціальних мережах:
Якщо тобі сподобалась дана тема, залиш свій коментар