
Лабораторна робота №7
Тема: Алгоритми на графах
Мета: Засвоїти теоретичні знання, вивчити алгоритми на графах
Теоретична частина
Численна кількість алгоритмів на графах ґрунтується на переборі всіх або частини їх вершин. Такий перебір називається обходом графу. Найвідоміші алгоритми обходу графу - це пошук вглибину та вшир.
Пошук вглибину
Розглянемо алгоритм пошуку вглибину у зв'язному неорієнтованому графі. Пошук починається із заданої стартової вершини і триває доти, доки не буде знайдено певної кінцевої вершини або поки є вершини, що утворюють маршрут пошуку. Стартову вершину пошуку позначимо літерою v. Виберемо довільне ребро (v, и), інциденте v. Якщо вершина и вже відвідана, вибираємо інше ребро, що є інцидентним v. У протилежному випадку вершину и вважаємо стартовою і повторюємо процедуру пошуку. Якщо пошук з вершини и завершується безуспішно, повертаємося до вершини v і продовжуємо пошук ребер, інцидентних вершині v і таких, що раніше не відвідувалися. Вибір нових ребер триває доти, доки не вичерпаються всі ребра, що є інцидентними v, або доки пошук кінцевої вершини не завершиться успішно. Зауважимо, що під час пошуку вглибину в орієнтованому графі слід переглядати лише ті дуги, що виходять зі стартової вершини.
Важлива властивість алгоритму пошуку вглибину полягає в тому, що моменти виявлення вершини v і завершення процесу обробки списку суміжних з нею вершин утворюють правильну дужкову структуру. Якщо позначити факт виявлення вершини v дужкою, що відкривається, а завершення процесу обробки суміжних з нею вершин — дужкою, що закривається, то послідовність дій утворить правильно побудований вираз із дужок.
Пошук ушир
За алгоритмом пошуку вшир здійснюється обхід вершин графу в порядку збільшення відстані від стартової вершини. Відстань між вершинами а і b вважається рівною кількості ребер на найкоротшому шляху від а до b. Отже, спочатку переглядається стартова вершина, потім - суміжні з нею вершини, що входять до списку перегляду. Кожна ітерація алгоритму полягає у послідовному виборі всіх вершин зі списку перегляду і додаванні до цього списку вершин, що є суміжними з вибраними. При цьому вершини не можуть переглядатися двічі, а тому під час перегляду вершину слід помічати. Помічені вершини надалі нe розглядаються.
Список перегляду найзручніше зображувати у вигляді черги. При перегляді вершини всі суміжні з нею непомічені вершини додаються до черги, а сама вершина з черги вилучається. Пошук виконується доти, доки не буде знайдено кінцевої вершини або доки список перегляду не стане порожнім.
Завдання
1.Реалізувати алгоритм пошуку вшир для знаходження шляху від стартової вершини до кінцевої в неорієнтованому графі. Інформація про граф записана у текстовому файлі, перший рядок якого містить кількість вершин графу, а кожний наступний рядок (визначає ребро графу) - два числа, що є номерами певних суміжних вершин.
2.Реалізувати алгоритм пошуку вглибину для знаходження шляхів від стартової вершини до кінцевої в неорієнтованому графі. Структура графу записана у текстовому файлі, що має структуру аналогічну файлу вхідних даних для програми пошуку вшир.
Контрольні запитання:
Граф…
Ребро…
Дуга…
Орієнтований граф…
Суміжні вершини…
Структури даних для зображення графу у пам’яті комп’ютера …
Матриця суміжності …
Матриця інциденцій неорієнтованого графу…
Матриця інциденцій орієнтованого графу
Використаємо алгоритм пошуку вшир для знаходження шляхів від стартової вершини до кінцевої в неорієнтованому графі. Структура графу записана в текстовому файлі, перший рядок якого містить кількість вершин графу, а кожний наступний рядок — два числа, що є номерами певних суміжних вершин. Тобто кожен рядок файла, починаючи з другого, визначає ребро графу. Номери стартової та кінцевої вершин користувач вводить з клавіатури.
вхідний файл:
5
1 3
Лабораторна робота №7 1
Тема: Алгоритми на графах 1
Мета: Засвоїти теоретичні знання, вивчити алгоритми на графах 1
Теоретична частина 1
Пошук вглибину 1
Розглянемо алгоритм пошуку вглибину у зв'язному неорієнтованому графі. Пошук починається із заданої стартової вершини і триває доти, доки не буде знайдено певної кінцевої вершини або поки є вершини, що утворюють маршрут пошуку. Стартову вершину пошуку позначимо літерою v. Виберемо довільне ребро (v, и), інциденте v. Якщо вершина и вже відвідана, вибираємо інше ребро, що є інцидентним v. У протилежному випадку вершину и вважаємо стартовою і повторюємо процедуру пошуку. Якщо пошук з вершини и завершується безуспішно, повертаємося до вершини v і продовжуємо пошук ребер, інцидентних вершині v і таких, що раніше не відвідувалися. Вибір нових ребер триває доти, доки не вичерпаються всі ребра, що є інцидентними v, або доки пошук кінцевої вершини не завершиться успішно. Зауважимо, що під час пошуку вглибину в орієнтованому графі слід переглядати лише ті дуги, що виходять зі стартової вершини. 1
Пошук ушир вершини finish, що розпочинається з вершини start, виконує процедура BreadthFirstSearch («пошук ушир»). Усі вершини, що є суміжними з поточною і не були помічені, додаються до черги за допомогою процедури AddList. Черга переглядається, починаючи від вершини PCur, тому виконання оператора PCur: =PCur^. Next є дією, логічно еквівалентною видаленню вершини з черги. У разі знаходження кінцевої вершини або вичерпування всіх можливостей пошуку, чергу слід очистити за допомогою процедури Clear. Нарешті, рекурсивна процедура Output здійснює виведення знайденого шляху. Для посилання на попередню вершину шляху використовується покажчик Prev.
Program vshyr; {пошук ушир }
uses crt;
type
PtrVer = ^TVer; {тип покажчика на вершину графу }
TVer = record {тип вершини графу }