ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 18.04.2019

Просмотров: 847

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Розглянемо приклад. Потрібно знайти найкоротші шляхи між усіма вершинами в заданому на рис. 30.8 графі за допомогою алгоритму Флойда-Уоршола.

Рис 30.8.

Нижче наведемо результати виконання кожної з чотирьох ітерації алгоритму Флойда-Уоршола:

;

;

;

;

;

;

;

;

;

.

Матриця дає довжини найкоротших шляхів між усіма парами вершин графу на рис. 30.8. Зокрема, , тобто довжина найкоротшого шляху від вершини 3 до вершини 2 дорівнює –1. Для знаходження самого шляху скористаємося матрицею та запишемо у зворотному порядку вершини через які він проходить: , , . Останнє значення свідчить про те, що найкоротший шлях з вершини 3 у вершину 4 йде безпосередньо з вершини 3, а отже процедуру можна зупинити. Таким чином отримали шлях: 3 – 4 – 1 – 2.

Очевидно, що як алгоритм Дейкстри, так і алгоритм Флойда-Уоршола можна застосовувати без жодних змін й до неорієнтованих графів. Для цього достатньо кожне ребро (u, v), що має вагу w(u, v), розглядати як пару дуг (u, v) та (v, u) з тією самою вагою. Слід ураховувати, що неорієнтоване ребро із від’ємною вагою одразу приводить до циклу із від’ємною довжиною, що робить алгоритм Флойда-Уоршола незастосовним.

30.7. Алгоритм Джонсона

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

Ідея алгоритму Джонсона полягає в наступному. Уявимо собі, що граф не містить ребер з від’ємними вагами. Тоді для знаходження найкоротших відстаней між усіма парами вершин ми можемо застосувати n разів алгоритм Дейкстри. У випадку, якщо в графі присутні негативні ребра, можна змінити вагу ребер таким чином, щоб всі вони стали додатними і тоді знову застосувати алгоритм Дейкстри n разів. Нехай w(u, v) – вага ребра (u, v). Введемо нові ваги ребер , для яких виконуються наступні дві властивості:

  1. Для всіх ребер (u, v) вага .

  2. Для всіх пар вершин u, v шлях p є найкоротшим шляхом з u до v із використанням вагової функції w тоді й тільки тоді, коли p – також найкоротший шлях з u до v із використанням вагової функції .

Лема 30.1. Нехай задано зважений граф G = (V, E) з ваговою функцією w: E  R і нехай h: V  R – довільна функція, що відображає вершини на дійсні числа. Для кожного ребра (u, v)  E визначимо . Нехай p – довільний шлях з вершини v1 до вершини vk з ваговою функцією w тоді й тільки тоді, коли він є найкоротшим шляхом з ваговою функцією . Крім того, граф G містить цикл з негативною вагою з використанням вагової функції w тоді й тільки тоді, коли він містить цикл з негативною вагою з використанням вагової функції .

Отже, для того, щоб перейти до застосування алгоритму Дейкстри декілька разів, нам лишається навчитись визначати значення нової вагової функції для кожного ребра. А для цього, відповідно, потрібно знати значення функцій h(v) для всіх vV. Це можна зробити наступним за наступним алгоритмом.


Алгоритм визначення нових ваг ребер

  1. Для даного графу G створимо новий граф G′ = (V′, E′), де V′ = V{s}, для деякої нової вершини sV, та E′ =  {(s, v): vV }.

  2. Розширимо вагову функцію w таким чином, щоб для всіх вершин vV виконувалась рівність w(s, v) = 0.

  3. Визначимо для всіх вершин vV величину h(v) як довжину найкоротшого шляху від вершини s до вершини v і нові ваги для всіх ребер .

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

Прийнятним способом визначення найкоротших відстаней від нової вершини s до всіх вершин графу G є алгоритм Белмана-Форда. Наведемо приклад роботи алгоритму визначення нових ваг ребер для графу, який представлений на рис. 30.8. Робота алгоритму Белмана-Форда для графу із доданою вершиною s наведений на рис. 30.9. Ребра, які виходять з вершини s та позначені пунктиром, мають вагу 0. Алгоритм зупиняє роботу на ітерації i = 3, адже за попередній крок не відбулось жодних змін ваг ребер (у порівнянні з ітерацією i = 2). На рис. 30.10, а наведені розраховані значення h(v) для всіх вершин vV графу, а на рис. 30.10, б – граф із новими вагами ребер.

а) i = 0

б) i = 1

в) i = 2

г) i = 3

Рис. 30.9. Визначення нових ваг ребер за допомогою алгоритму Белмана-Форда.

v

a

b

c

d


h(v)

0

–2

0

–3

а)


б)

в)

г)

Рис. 30.10. Значення функції h(v) для всі вершин (а); граф з новими вагами ребер (б); матриця відстаней для нового графу (в); матриця відстаней для оригінального графу (г).

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

  1. Створити новий граф G′ шляхом додавання нової вершини s і ребер (s, v) з вагою 0 для всіх vV.

  2. Запустити алгоритм Белмана-Форда для графу G′ і початкової вершини s. Якщо алгоритм Белмана-Форда сповістив про знаходження негативного циклу, то закінчити роботу алгоритму з помилкою.

  3. Для всіх вершин vV визначити величину h(v) як довжину найкоротшого шляху від вершини s до вершини v (за результатами алгоритму Белмана-Форда) і нові ваги для всіх ребер .

  4. Для кожного вершини uV запустити алгоритм Дейкстри для знаходження найкоротшої відстані від вершини u до всіх інших вершин графу vV. Сформувати на основі отриманих відстаней матрицю D′.

  5. Визначити реальну відстань d(u, v) = d′(u, v) – h(u) + h(v), де d′(u, v) – елемент матриці D′.

Для розглянутого вище прикладу матриця відстаней для модифікованого графу D′ наведена на рис. 30.10, в, а матриця відстаней для початкового графу D – на рис. 30.10, г. Як бачимо, отримана матриця D дорівнює матриці , яка була знайдена під час роботи алгоритму Флойда-Уоршола для цього самого графу (стор. 196).

Конкретні найкоротші маршрути, а не тільки їх довжина, визначаються на етапі запуску алгоритмів Дейкстри для кожної окремо взятої початкової вершини u.


Визначимо час роботи алгоритму Джонсона. Перший крок виконується за час О(n), другий – за час О(nm), третій – за час О(m), четвертий – за час О(nm lgn), п’ятий – за час О(n2). Таким чином, загальний час роботи визначається як найбільший з наведений етапів, тобто О(nm lgn). Для розряджених графів це значення виявляється набагато меншим, ніж величина О(n3) яку дає алгоритм Флойда-Уоршола.

Підіб’ємо підсумки. Якщо необхідно знайти відстань від однієї вершини до іншої або до всіх вершин графу і ваги всіх ребер графу є додатними або дорівнюють нулю, то найбільш ефективним виявляється алгоритм Дейкстри із часом роботи О(m lgn). Якщо ж ваги ребер можуть бути від’ємними, то необхідно застосовувати алгоритм Белмана-Форда, час роботи якого О(nm).

Якщо необхідно знайти відстані між усіма парами вершин графу, граф є розрядженим і всі ребра мають невід’ємні ваги, то можна виконати n разів алгоритм Дейкстри. Якщо ж граф є розрядженим, але в ньому можуть бути ребра з від’ємними вагами, то необхідно використовувати алгоритм Джонсона. Якщо необхідно знайти відстані між усіма парами вершин, ваги ребер можуть бути від’ємними і граф не є розрядженим (m прямує до n2), то необхідно використовувати алгоритм Флойда-Уоршола.

Жоден з наведених алгоритмів не може бути застосований для графів, які містять негативні цикли. Проте алгоритм Белмана-Форда (як і алгоритм Джонсона), а також алгоритм Флойда-Уоршола можуть виявити такі цикли.