Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6. Grafy.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.06 Mб
Скачать

3.9. Алгоритм Флойда

Наведемо кроки алгоритму.

Крок 1. Присвоювання початкових значень. Пронумерувати вершини графа G цілими числами від 1 до n. Побудувати матрицю W(0)= W, задавши кожний її (i,j)-елемент такий, що дорівнює вазі дуги, котра з'єднує вершину і з вершиною j. Якщо в графі G ці вершини не з'єднано дугою, то виконати := . Крім того, для всіх і виконати := 0.

Крок 2. Цикл. Для k, що послідовно набуває значення 1, 2, …, п, визначити за елементами матриці W(k-1) елементи матриці W(k) використовуючи рекурентне співвідношення (3.1).

Після закінчення цієї процедури (і,j) - елемент матриці W(n) дорівнює довжині найкоротшого шляху з вершини і у вершину j.

Якщо під час роботи алгоритму для якихось k й і виявиться, що < 0, то в графі G існує цикл із від'ємною довжиною, який містить вершину і. Тоді роботу алгоритму потрібно припинити.

Якщо заздалегідь відомо, що в графі Є немає циклів із від'ємною довжиною, то обсяг обчислень можна дещо зменшити. У цьому разі для всіх і та всіх k має бути = 0. Тому не потрібно обчислювати діагональні елементи матриць W(1) ,W(2) , …, W(n). Окрім того, для всіх і = 1, 2, …, п справджуються співвідношення = , = які випливають із того, що коли немає циклів із від'ємною довжиною, вершина k не може бути внутрішньою в будь-яких найкоротших шляхах, котpі починаються чи закінчуються в самій вершині k. Отже, обчислюючи матрицю немає потреби переобчислювати елементи k-го рядка й k-го стовпця матриці W(k-1). Отже, у матриці W(k) за формулою (3.1) потрібно обчислювати лише k2 – З × п + 2 елементи. Очевидно, що складність алгоритму Флойда становить 0(п3). Щоб після закінчення його роботи можна було швидко знайти найкоротший шлях між будь-якою парою вершин, на kітерації разом із матрицею W(k) побудуємо матрицю (k) =[ ]. Спочатку беремо :=і для всіх і,j= 1, …, п, ; := 0. Далі, на к-й ітерації візьмемо = , якщо = і = , якщо = + . Отже, — номер вершини, яка є перед вершиною j у поточному (i, j) - шляху, тобто найкоротшому (i, j) - шляху, усі внутрішні вершини якого містяться в множині (1, 2, …, k). Матриця (n) =[ ] відіграє ту саму роль, що й вектор в алгоритмі Дейкстри. За допомогою матриці (k) вершини, через які проходить найкоротший (i, j) - шлях, визначають так: i, …, j3, j2, j1, j, де j1= , j2= , j3= , … .

Приклад 3.34. Знайти найкоротші шляхи між усіма парами вершин орієнтованого графа на рис. 3.38.

Рис. 3.38 Граф до прикладу 3.34

Нижче наведено результати виконання кожної з чотирьох

W(0)= W= (0)=

W(1)= (1)=

W(2)= (2)=

W(3)= (3)=

W(4)= (4)=

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

Очевидно, що як алгоритм Дейкстри, так і алгоритм Флойда можна застосовувати без жодних змін і до неорієнтованих графів. Для цього достатньо кожне ребро {и, V}, що має вагу (и, V), розглядати як пару дуг (и, V) та (V, и) з тією самою вагою. Слід ураховувати, що неорієнтоване ребро із від'ємною вагою одразу приводить до циклу із від'ємною довжиною, що робить алгоритм Флойда незастосовним.