Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дискретка.doc
Скачиваний:
121
Добавлен:
28.03.2016
Размер:
13.01 Mб
Скачать

§ 2.2. Задача про найкоротший шлях у графі

Наведемо приклади практичних задач, розв’язок яких може бути зведено до пошуку найкоротшого шляху в графі.

Приклад 1. Маємо мережу автомобільних доріг, яка з'єднує міста Дніпропетровської області. Деякі з них односторонні. Знайти найкоротші шляхи від Дніпропетровська до кожного міста області (якщо рухатися можна тільки по дорогах).

Приклад 2. Наявна деяка кількість авіарейсів між містами світу, вартість кожного з них відома. До того ж вартість перельоту з міста A в місто B не обов’язково дорівнює вартості перельоту у зворотному напрямку. Визначити маршрут між двома заданими містами (можливо з пересадками), який має мінімальну вартість.

Сформулюємо цю задачу математично.

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

Для будь-яких двох вершин s і t графа G можуть існувати кілька шляхів, які з'єднують вершину s із вершиною t. Необхідно визначити шлях мінімальної довжини, який з’єднує вершину s і вершину t. Його називають найкоротшим шляхом між вершинами s і t.

Нижче буде розглянуто алгоритм, який дозволяє визначити такий шлях.

Алгоритм пошуку найкоротшого шляху (алгоритм Дейкстри)

Ідея алгоритму. Кожній вершині з множини Х поставимо у відповідність число d(x) – найменшу відому відстань від цієї вершини до s. Алгоритм включає кілька кроків, зокрема на кожному кроці опрацьовується одна вершина з метою зменшення чисел d(x). Робота алгоритму закінчується, коли всі вершини опрацьовано.

Опишемо цей алгоритм.

Крок 1. Ініціалізація.

Задамо, що ідля всіх вершинx, відмінних від s (це відображає той факт, що відстані до цих вершин на даний момент не відомі). Жодну вершину ще не опрацьовано (не забарвлено). Через y  позначимо останню із забарвлених вершин. Позначимо (пофарбуємо) вершину s і приймемо, що y = s.

Крок 2. Основний крок алгоритму.

Для кожної незабарвленої вершини x перерахуємо величину відстані в такий спосіб:

. (2.1)

Якщо для всіх незабарвлених вершинx, то належить закінчити процедуру алгоритму, оскільки у вихідному графі відсутні шляхи з вершини s у незабарвлені вершини.

Коли ні, то слід пофарбувати ту з вершин x, для якої величина найменша. Крім того, потрібно пофарбувати дугу, що веде до обраної на даному кроці вершиниx [саме для цієї дуги досягався мінімум виразу (2.1)]. Прийняти, що .

Крок 3. Якщо, то процедуру закінчити, оскільки найкоротший шлях від вершиниs до вершини t знайдений (це єдиний шлях від s до t, який складається із забарвлених дуг). А якщо ні, то перейти до кроку 2.

Алгоритм описано.

Забарвлені дуги утворюють у вихідному графі орієнтоване дерево з коренем у вершині s. Його називають орієнтованим деревом найкоротших шляхів. Єдиний шлях від вершини s до будь-якої вершини x, що належить дереву найкоротших шляхів, буде найкоротшим шляхом між зазначеними вершинами.

Оскільки на всіх етапах алгоритму Дейкстри забарвлені шляхи утворюють у вихідному графі орієнтоване дерево, то алгоритм можна розглядати як процедуру нарощування орієнтованого дерева з коренем у вершині s. Коли в процедурі нарощування буде досягнуто вершини t, процедуру припиняють.

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

Отже, для того, щоб описаний вище алгоритм дозволив одержати дерево найкоротших шляхів від вершини s до всіх інших вершин, його третій крок повинен бути скорегований у такий спосіб:

Крок 3а. Якщо всі вершини виявляються забарвленими, то процедуру закінчують (існує єдиний найкоротший шлях від вершини s до будь-якої вершини x, і він складається тільки із забарвлених дуг) А якщо ні, то повертаються до кроку 2.

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

  • На другому кроці алгоритму перерахування величини відстані за допомогою співвідношення (2.1) проводиться для всіх вершин, а не тільки для незабарвлених. Отже, числаможуть зменшуватися як для незабарвлених, так і для пофарбованих вершин.

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

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

Приклад 1. За допомогою алгоритму Дейкстри визначити найкоротший шлях між вершинами s і t у графі, зображеному на рис. 2.4.

Рис. 2.4. Граф до прикладу 1

Розв’язування

Крок 1. Зафарбуємо вершину s. Приймемо, що і. На графі запишемо значення величин поряд із вершиною. Тоді він набуває поданого на рис. 2.5 вигляду.

Рис. 2.5. Перший крок алгоритму пошуку найкоротшого шляху

Крок 2. Для незабарвлених вершин зробимо перерахування відстаней , а саме:

Оскільки , то зафарбовуємо вершинуc і дугу . Поточне дерево найкоротших шляхів показано на графі (рис. 2.6) товстою лінією.

Крок 3. Через те, що вершина t залишилася незабарвленою, повертаємось до кроку 2, прийнявши, що .

Рис. 2.6. Побудова дерева найкоротших шляхів (крок 2, )

Крок 2 .

Перераховуємо величини для незабарвлених вершин х, а саме:

Оскільки , то зафарбовуємо вершину a й дугу . Поточне дерево найкоротших шляхів набуває вигляду, зображеного на рис. 2.7.

Рис. 2.7. Побудова дерева найкоротших шляхів (крок 2, )

Крок 3. Вершина t залишилася незабарвленою, тому повертаємось до кроку 2, прийнявши, що .

Крок 2 .

Для незабарвлених вершин робимо перерахування чисел , а саме:

Враховуючи, що , зафарбовуємо вершинуd й дугу . Зауважимо, що можна було зафарбувати дугу .

Поточне дерево найкоротших шляхів набуває вигляду, показаного на рис. 2.8.

Рис. 2.8. Поточне дерево найкоротших шляхів (крок 2, )

Крок 3. Оскільки вершина t залишилася незабарвленою, то знов повертаємось до кроку 2, вважаючи, що .

Крок 2 .

Для незабарвлених вершин робимо перерахування відстаней :

Оскільки , то зафарбовуємо вершину b й дугу . Можна було б також зафарбувати дугу.

Поточне дерево найкоротших шляхів набуває вигляду, поданого на рис. 2.9.

Рис. 2.9. Поточне дерево найкоротших шляхів (крок 2, )

Крок 3. Вершина t залишилася незабарвленою, тому знову повертаємось до кроку 2, приймаючи, що .

Крок 2. .

Для незабарвлених вершин робимо перерахування чисел , а саме:

Отже, вершину t, нарешті, можна пофарбувати. Разом з нею фарбуємо й дугу , яка визначає величину.

Остаточно побудоване дерево найкоротших шляхів має вигляд, показаний на рис. 2.10.

Рис. 2.10. Дерево найкоротших шляхів у графі з прикладу 1

Очевидно, що у вихідному графі є два найкоротші шляхи однакової довжини: перший шлях складається з дуг ; другий шлях включає дуги.

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

Приклад 2. Застосуємо алгоритм Форда до графа, поданого на рис. 2.11.

Рис. 2.11. Граф до прикладу 2

Розв’язування

Крок 1. Зафарбуємо вершину s. Задамо, що і . Позначимо величинипоряд з вершинами графа (рис. 2.12).

Рис. 2.12. Крок 1 алгоритму Форда в прикладі 2

Крок 2 .

Для незабарвлених вершин x робимо перерахування чисел , а саме:

Беручи до уваги, що зафарбовуємо вершинуt й дугу Поточне дерево найкоротших шляхів набуває вигляду, зображеного на рис. 2.13.

Рис. 2.13. Крок 2 алгоритму Форда у прикладі 2

Крок 3. Оскільки забарвленими виявилися не всі вершини, повертаємось до кроку 2, вважаючи, що .

Крок 2

Враховуючи те, що з вершини t не виходить жодна дуга, усі числа залишаються незмінними, тому фарбуємо вершинуa і разом з нею дугу . Поточне дерево найкоротших шляхів позначено на графі (див. рис. 2.14) товстою лінією.

Рис. 2.14. Крок 2 алгоритму Форда в прикладі 2

Крок 3. Здійснюємо повернення до кроку 2, аби спробувати зменшити значення чисел .

Крок 2 .

Обчислюємо, що

Оскільки величина зменшується від 1 до 0, то з вершиниt і дуги фарбування знімається.

Тепер поточне дерево найкоротших шляхів має вигляд, показаний на рис. 2.15.

Рис. 2.15. Крок 2 алгоритму Форда в прикладі 2

У вихідному графі залишається незабарвленою тільки вершина t . Зафарбовуємо її разом з дугою , оскільки на даному кроці.

Дерево найкоротших шляхів тепер набуває вигляду, зображеного на рис. 2.16.

Крок 3. Здійснюємо чергове повернення до кроку 2.

Крок 2

Враховуючи те, що з вершини t не виходить жодна дуга, значення чисел не змінюються. Незабарвлених вершин у графі немає.

Крок 3. З огляду на те, що всі вершини в графі виявляються забарвленими й на попередньому кроці алгоритму жодну з величин зменшити не вдалося, процедура алгоритму завершується, найкоротший шлях з вершиниs у вершину t складається з дуг і має таку довжину: 2 – 2 = 0 (див. рис. 2.16).

Рис. 2.16. Найкоротший шлях у графі з прикладу 2

Зауважимо, що алгоритм Форда не забезпечує розв’язування зазначеної задачі за умови наявності у вихідному графі контуру, довжина якого становить від’ємну величину. Дійсно, у цьому випадку можна, необмежене число раз «повторюючи» цей контур, одержати шлях як завгодно малої довжини.

У ситуації, коли немає даних про відсутність або наявність у розглянутому графі контурів від’ємної довжини, можна застосовувати алгоритм Форда, але в процесі його застосування необхідно враховувати, скільки разів забарвлюються окремі вершини. Коли число фактів забарвлення однієї з вершин досягає величини N, де N – число вершин графа, процедуру алгоритму можна зупинити, бо вихідний граф містить контур, довжина якого має від’ємне значення. Якщо ж цього не відбувається, то процедура алгоритму Форда завершується протягом скінченної кількості кроків, а вихідну задачу буде розв’язано правильно.