Інтерактивний матеріал для уроку з інформатики 11 класу за новою програмою на тему: ""Графи. ПОШУК У ШИРИНУ ТА ГЛИБИНУ." Розроблено вчителем інформатики Цодіковою Л.М.
Пошук у ширину. Як відомо, одним із найпоширеніших способів представлення графа є матриця суміжності. Саме на перегляді цієї матриці і базується метод пошуку в ширину. Почнемо пошук шуканої вершини 7 із заданої вершини 1 і зафіксуємо для себе цю інформацію, будуючи дерево пошуку, в якому на першому кроці нашого пошукового алгоритму є лише одна вершина 1 та послідовність вершин, які переглядаються.
Якщо забігти наперед і розглянути заданий граф (мал. 21, а), то можна помітити, що вершину з номером 1 знову побачимо, коли перейдемо до перегляду вершин 2, 3 та 4. Тому варто запам’ятовувати номери вершин, у яких ми вже побували, для того, щоб виключити їх надалі з перегляду. Два способи перегляду: перший - проглядати послідовність переглянутих вершин (мал. 22, б), другий - використати множину для їх фіксації (мал. 22, в). Встановимо покажчики перегляду вершин у послідовності так: верхній вказуватиме на номер вершини, з якої ми дивимося, а нижній - на номер останньої «видимої» вершини. Відповідно на першому кроці такою вершиною є єдина вершина 1.
Для подальшого пошуку перейдемо до однієї з нових вершин, які ми побачили. Це вершини 2, 3 і 4. У нашій послідовності (мал. 23, б) першою записана вершина 2, тому й перейдемо до неї. З вершини 2 бачимо вершини 1, 3, 5 і 6. Лише вершини 5 і 6 є новими, а вершини 1 і 3 ми вже бачили на попередніх кроках нашого алгоритму. Доповнимо дерево пошуку.
У послідовності ми ще не дісталися шуканої вершини 7, тому переходимо у послідовності вершин до наступної «побаченої» вершини 3, яку тепер можна буде назвати не лише «побаченою», але ще й «переглянутою». Згідно із зображенням графа і відповідної йому таблиці суміжності з вершини З ми бачимо вершини 1, 2, 4 і 5. Але вони не є новими, тому ми їх не фіксуємо ні у дереві пошуку, ні у послідовності вершин, ні у множині (мал. 25, а, б, в).
Продовжуючи логіку нашого алгоритму, переходимо до вершини 5 - наступної у нашій послідовності (мал. 27, б). З вершини 5 ми бачимо вершини 2,3,7. Перші дві з цих вершин уже були переглянуті, а от вершина 7 не тільки нова, але й ще шукана. Тому алгоритм можна вважати завершеним, а відповідь на поставлене на початку запитання буде такою: «У заданому графі вершина 7 є досяжною з вершини 1».
Тепер ми можемо проаналізувати умови завершення роботи алгоритму пошуку в ширину. Таких випадків є два: шукана вершина знайдена і відомий шлях до неї, або шукана вершина є недосяжною і шлях до неї відсутній. Ми розглянули саме перший випадок пошуку вершини в графі, коли шукана вершина 7 є досяжною із заданої вершини 1. Шлях від вершини 1 до вершини 7 присутній у черзі, але без додаткової інформації він дещо прихований. Для отримання цього шляху необхідно запам’ятовувати також і номери вершин, з яких ми побачили кожну наступну вершину. На малюнку 28 ця інформація позначена індексами для кожної поточної вершини, записаної у чергу.
Пошук у глибину. Якщо під час пошуку в ширину ми захоплювали усі нові вершини, що нам було видно з поточної вершини, у яку переміщувалися на кожному наступному кроці, то під час пошуку в глибину на кожному кроці алгоритму, знаходячись у наступній поточній вершині, будемо бачити лише одну нову, досі не «видиму», вершину і переходити до неї. Розглянемо той самий граф, що й у попередньому випадку (мал. 21, а), і його таблицю суміжності (мал. 21, б). Будемо знову шукати шлях від вершини 1 до вершини 7. Під час пошуку будемо так само, як і в попередньому алгоритмі, будувати дерево пошуку, послідовність переглянутих і нових «видимих» вершин та множину «відвіданих» вершин.
Наступний крок буде таким: згідно з таблицею суміжності першою новою вершиною, яку ми бачимо з вершини 1, є вершина 2. Перейдемо до неї, додавши її у дерево пошуку, в послідовність «відвіданих» вершин і у множину (мал. 30, а, б, в). Перейшовши тепер у вершину 2, згідно з таблицею суміжності першою новою «видимою» вершиною є вершина З, оскільки вершину 1 ми вже відвідали. Додамо цю нову вершину до нашого дерева пошуку, в послідовність та множину (мал. 30, г, д, е) і перейдемо у послідовності до неї.
Якщо на наступному кроці алгоритму ми подивимося з вершини 3, то зможемо побачити вершини у такій послідовності (третій рядок таблиці суміжності): 1, 2, 4, 5. Серед них першою новою вершиною є вершина 4. Додамо її до переглянутих і перейдемо до неї. Що нового ми побачимо з вершини 4? Згідно з малюнком 21, а, б, ми побачимо вершини 1 і 3. Але жодна з них не є новою.
Попередньою вершиною була вершина 3, і ми повернемося саме до неї (мал. 32, б). Подивимося на заданий граф: чи є з вершини 3 інший шлях, відмінний від вершини 4? Так, це шлях через вершину 5. І ця вершина є наступною новою вершиною, яку ми можемо побачити з вершини 3. Перейдемо до неї, записавши її у дерево пошуку.
Застосуємо нашу стратегію до останньої «переглянутої» вершини 5. З неї ми бачимо вершини 2, 3, 7. Але серед них вершина 7 є новою і одночасно шуканою. Саме тому дописуємо її в усі три інформаційні схеми (мал. 34, а, б, в) та вважатимемо пошук завершеним. Ми знайшли відповідь на запитання за допомогою алгоритму пошуку в глибину: у заданому графі вершина 7 є досяжною з вершини 1 і шлях до неї міститься у послідовності, зображеній на малюнку 34, б.
Як видно з покрокового виконання описаного алгоритму, ми весь час працюємо з таблицею суміжності, беручи звідти інформацію про одну нову «видиму» вершину із поточної вершини графа. Ця нова вершина записується у послідовність, яка обробляється за алгоритмом роботи зі стеком: ми дописуємо нову інформацію в кінець цієї послідовності і, у разі потрапляння у тупик, повертаємося до її передостаннього елемента, не розглядаючи надалі останній записаний елемент послідовності. І на останок: для запобігання повернення у тупикові вершини інформацію про всі відвідані вершини зберігатимемо у множині. У разі відсутності шляху між двома заданими вершинами ми завершимо перегляд усіх записаних у стек вершин, повертаючись кожного разу до попередньої, спорожнивши тим самим стек. Отже, ознакою відсутності шляху в графі між двома заданими вершинами є те, що на деякому кроці алгоритму стек стане порожнім.
алгоритм пошуку в глибину у словесній форміВказати номер вершини k, з якої починається пошук заданої шуканої вершини l. Почати перегляд вершин заданого графа з вершини k, записавши її у стек: і := k. Якщо існує нова вершина з найменшим порядковим номером, яку можна побачити з вершини і, то зафіксувати її, записавши у стек і збільшивши при цьому індекс вершини стеку і на 1: і := і + 1. У протилежному випадку перейти до п. 5. Якщо нова «побачена» вершина, записана у стек, є шуканою, то перейти до п. 7. Якщо з поточної вершини графа, яка записана у вершині стеку, не видно жодної нової вершини, то відкинути цю вершину, перейшовши до попередньої у стеку, зменшивши для цього значення індексу вершини стеку на 1: і := і - 1. Якщо після цього стек став порожнім, тобто і = 0, то перейти до п. 9. Перейти до перегляду наступної «побаченої» вершини і (п. 3). Вивести інформацію про те, що шукану вершину І досягнуто і шлях до неї від вершини k існує. Перейти до п. 10. Вивести інформацію про те, що шукана вершина І недосяжна від вершини k і шлях до неї відсутній. Завершити алгоритм.