В інформатиці алгоритм Флойда — Воршелла служить для розв'язання задачі про найкоротший шлях в орієнтованому зваженому графі з додатними або від'ємними вагами ребер (але без негативних циклів).
Клас | Задача про найкоротший шлях (для зважених графів) |
---|---|
Структура даних | Граф |
Найгірша швидкодія | |
Найкраща швидкодія | |
Просторова складність у найгіршому випадку |
При звичайній реалізації алгоритм повертає довжини (сумарні ваги) найкоротших шляхів між усіма парами вершин. Модифікація алгоритму може також повертати інформацію про самі шляхи. Різні версії алгоритму також використовують для знаходження транзитивного замикання у відношенні , або для знаходження найширшого шляху між усіма парами вершин у зваженому графі (наприклад, при використанні методу Шульце).
Історія і назва
Алгоритм було опубліковано в звичній сьогодні формі Робертом Флойдом 1962 року. Проте це практично той самий алгоритм, що був опублікований [en] 1959 року і Стівеном Воршеллом 1962 року для знаходження транзитивного замикання в графі, і є досить тісно пов'язаним з [en] (опублікованим 1956 року) для перетворення детермінованих скінченних автоматів у регулярні вирази. Сучасне формулювання алгоритму як трьох вкладених циклів було вперше подано Пітером Інгерманом 1962 року.
Алгоритм Флойда — Воршелла також відомий як Алгоритм Флойда, Алгоритм Роя — Воршелла, Алгоритм Роя — Флойда, або Алгоритм WFI.
Алгоритм
Ця стаття містить правописні, лексичні, граматичні, стилістичні або інші мовні помилки, які треба виправити. (липень 2021) |
Алгоритм Воршелла порівнює всі можливі шляхи в графі між кожною парою вершин. Він виконується за порівнянь. Це доволі швидко, враховуючи, що в графі може бути до ребер, і кожну комбінацію буде перевірено. Він виконує це шляхом поступового поліпшення оцінки найкоротшого шляху між двома вершинами, поки оцінка не стає оптимальною.
Нехай є граф з вершинами , пронумерованими від до . Крім того, нехай є функція , яка повертає найкоротший шлях від до , використовуючи вершини з множини як проміжні у шляху. Маючи таку функцію, нам потрібно знайти найкоротший шлях від кожного до кожного , використовуючи лише вершини з множини .
Для кожної з цих пар вершин, найкоротшим шляхом може бути або
- 1) шлях, у якому є тільки вершини з множини ,
або
- 2) шлях, який крізь вершини з множини проходить спочатку від до , а потім від до .
Найкоротший шлях від до , у якому є тільки вершини від до , визначається функцією . Якщо є коротший шлях від крізь до , то довжина цього шляху буде сумою (конкатенацією) найкоротшого шляху від до (крізь вершини з ) та найкоротшого шляху від до (також крізь вершини з ).
Якщо позначити вагу ребра від до через , можна визначити наступною рекурентною формулою:
База:
- ,
рекурентна частина:
Ця формула є основною частиною алгоритму Флойда — Воршелла. Алгоритм спочатку обчислює для всіх пар при , потім при , і т. д. Цей процес продовжується до виконання умови (включно), в результаті чого буде знайдено всі найкоротші шляхи для пар крізь будь-які проміжні вершини. Псевдокод для цієї версії алгоритму:
1 let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity) 2 for each vertex v 3 dist[v][v] ← 0 4 for each edge (u, v) 5 dist[u][v] ← w(u, v) // the weight of the edge (u, v) 6 for k from 1 to |V| 7 for i from 1 to |V| 8 for j from 1 to |V| 9 if dist[i][j] > dist[i][k] + dist[k][j] 10 dist[i][j] ← dist[i][k] + dist[k][j] 11 end if
Приклад
Наведений вище алгоритм виконується на графі, розташованому ліворуч на малюнку нижче:
Перед першою ітерацією циклу, тобто при , усі відомі шляхи відповідають одиничним ребрам у графі. Після кроку алгоритм знаходить шляхи, які проходять через вершину . Зокрема, шлях замінить шлях , що проходить через меншу кількість ребер, але є довшим (у сенсі ваги). Після знайдено шляхи, що проходять через вершини . Червоні та блакитні обведення показують, як шлях складається зі шляхів та , визначених на попередніх ітераціях. Шлях не розглядається, тому що найкоротшим шляхом від до на даному етапі є . Після знайдено шляхи, що проходять через . Нарешті, після , знайдено всі найкоротші шляхи.
При негативних циклах
Негативний цикл — це цикл, в якому сума всіх ребер є меншою за нуль. Між будь-якою парою вершин , що входять до негативного циклу, не існує найкоротшого шляху, оскільки довжина шляху між ними може бути наскільки завгодно малою (від'ємною). Для отримання осмисленого результату, алгоритм Флойда — Воршелла передбачає відсутність у графі негативних циклів. Тим не менш, якщо негативні цикли існують, алгоритм Флойда — Воршелла можна використати, щоб виявити їх. Інтуїтивно можна навести наступні міркування:
- Алгоритм Флойда — Воршелла багаторазово змінює довжини шляху між усіма парами вершин , включаючи ті, де ;
- Початкова довжина шляху рівна 0;
- Шлях може покращити початкову довжину, якщо він має довжину меншу за нуль, тобто позначає негативний цикл;
- Таким чином, після виконання алгоритму, найкоротший шлях буде від'ємним, якщо існує негативний цикл — шлях від'ємної довжини від назад до .
Отже, для виявлення негативних циклів з використанням алгоритму Флойда — Воршелла можна перевірити діагональ матриці шляхів. Присутність від'ємного числа означатиме, що графік містить щонайменше один негативний цикл. Під час виконання алгоритму присутність негативного циклу може викликати появу чисел, які на порядки перевищують модуль найменшої від'ємної ваги ребра. Щоб уникнути проблем переповнення або зникнення порядку, потрібно перевіряти діагональ матриці шляхів у внутрішньому циклі алгоритму. Очевидно, що в неорієнтованому графі негативне ребро створює негативний цикл за участі прилеглих до ребра вершин. Якщо розглядати граф з попереднього прикладу як неорієнтований, то послідовність ребер утворюють цикл довжини .
Знаходження шляху
Алгоритм Флойда — Воршелла зазвичай знаходить тільки довжини шляхів між усіма парами вершин. За допомогою простих змін можна створити функцію для відновлення фактичного шляху між будь-якими двома кінцевими точками вершин. У наївному підході можна зберігати шлях від кожної вершини до кожної вершини, але це не обов'язково, і насправді дуже витратно щодо пам'яті. Натомість, [en] може бути обчисленим для кожної вершини за час , використовуючи пам'яті для збереження кожного дерева, що дозволить ефективно відтворити шлях між будь-якими двома з'єднаними вершинами.
let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity) let next be a |V| × |V| array of vertex indices initialized to null procedure FloydWarshallWithPathReconstruction() for each edge (u, v) dist[u][v] ← w(u, v) // the weight of the edge (u,v) next[u][v] ← v for k from 1 to |V| // standard Floyd-Warshall implementation for i from 1 to |V| for j from 1 to |V| if dist[i][k] + dist[k][j] < dist[i][j] then dist[i][j] ← dist[i][k] + dist[k][j] next[i][j] ← next[i][k] procedure Path(u, v) if next[u][v] = null then return [] path ← [u] while u ≠ v u ← next[u][v] path.append(u) return path
Аналіз
Нехай дорівнює кількості вершин . Щоб знайти усі значень (для всіх пар ), виходячи з відомих , потрібно операцій. Оскільки ми починаємо з та рахуємо послідовність матриць , кількість операцій становить , і складність алгоритму становить ().
Застосування
Алгоритм Флойда — Воршелла можна використовувати для вирішення таких задач:
- Знаходження найкоротших шляхів у напрямленому графі.
- Знаходження транзитивних замикань у напрямленому графі. В оригінальному формулюванні (Воршелла), граф є незважений і представлений булевою матрицею. Операції додавання і мінімуму замінені на логічні AND i OR.
- Знаходження регулярних виразів, що позначають регулярні граматики, які приймаються скінченним автоматом ([en], який є узагальненням алгоритму Флойда — Воршелла).
- Невиродженість матриці в методі Гауса
- Оптимальна маршрутизація. У такій постановці задача полягає у знаходженні шляху з максимальним потоком між двома вершинами. Це означає, що замість мінімумів, як у псевдокоді вище, шляхи оптимізуються по максимумах. Вагами ребер задаються фіксовані обмеження на величину потоку. Загальний потік вздовж шляху характеризується ребром з найменшим пропусканням, тому операція додавання замінюється на взяття мінімуму.
- Знаходження найдовшого шляху.
- Швидкі обрахунки у [en].
- Розрахунок канонічних форм [en].
Реалізація
Реалізація алгоритму доступна багатьма мовами:
- , в бібліотеці boost::graph [ 13 січня 2008 у Wayback Machine.]
- C#, в QuickGraph [ 17 березня 2010 у Wayback Machine.] та QuickGraphPCL [ 11 червня 2020 у Wayback Machine.]
- Java, у бібліотеці Apache Commons Graph [ 12 травня 2013 у Wayback Machine.]
- JavaScript, у бібліотеці [en]
- MATLAB, у пакеті Matlab_bgl [ 17 серпня 2013 у Wayback Machine.]
- Perl, в модулі Graph [ 8 жовтня 2013 у Wayback Machine.]
- Python, в бібліотеці NetworkX та модулі scipy.sparse.csgraph [ 11 червня 2020 у Wayback Machine.] бібліотеки SciPy
- R, в пакетах e1071 [ 27 червня 2015 у Wayback Machine.] та Rfast [ 18 липня 2020 у Wayback Machine.]
Порівняння з іншими алгоритмами
Алгоритм Флойда — Воршелла добре підходить для обчислення шляху між усіма парами вершин у щільних графах, в яких більшість або всі пари вершин з'єднані ребрами. Для розріджених графів з невід'ємними вагами ребер краще використовувати алгоритм Дейкстри для кожної можливої вихідної вершини, оскільки складність алгоритму Дейкстри ( з використанням купи Фібоначчі) є кращою, ніж — складність алгоритму Флойда — Воршелла, коли набагато менше від . Для розріджених графів з негативними ребрами, але без негативних циклів, може бути використаний алгоритм Джонсона з тим самим асимптотичним часом роботи, що й повторюваний алгоритм Дейкстри.
Є також відомі алгоритми, що використовують швидке множення матриць для пришвидшення процесу пошуку найкоротшого шляху між усіма парами вершин у щільних графах. Проте у них робиться додаткове обмеження на ваги ребер (вони повинні бути малими цілими). Крім того, через високі сталі коефіцієнти у виразі складності, вони можуть забезпечити пришвидшення відносно алгоритму Флойда — Воршелла лише для дуже великих графів.
Посилання
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. 25.2 Алгоритм Флойда — Воршала. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
- Kenneth H. Rosen (2003). Discrete Mathematics and Its Applications, 5th Edition. Addison Wesley. ISBN .
- (June 1962). Algorithm 97: Shortest Path. Communications of the ACM. 5 (6): 345. doi:10.1145/367766.368168.
- (1959). Transitivité et connexité. . 249: 216—218.
- Warshall, Stephen (January 1962). A theorem on Boolean matrices. . 9 (1): 11—12. doi:10.1145/321105.321107.
- Weisstein, Eric W. Floyd-Warshall Algorithm(англ.) на сайті Wolfram MathWorld.
- (1956). Representation of events in nerve nets and finite automata. У and J. McCarthy (ред.). Automata Studies. Princeton University Press. с. 3—42.
- Ingerman, Peter Z. (November 1962). Algorithm 141: Path Matrix. Communications of the ACM. 5 (11): 556. doi:10.1145/368996.369016.
- Dorit Hochbaum (2014). (PDF). Lecture Notes for IEOR 266: Graph Algorithms and Network Flows. Department of Industrial Engineering and Operations Research, University of California, Berkeley. Архів оригіналу (PDF) за 20 жовтня 2016. Процитовано 2 червня 2015.
- Stefan Hougardy (April 2010). . Information Processing Letters. 110 (8-9): 279—281. doi:10.1016/j.ipl.2010.02.001. Архів оригіналу за 24 вересня 2015. Процитовано 2 червня 2015.
- Gross, Jonathan L.; Yellen, Jay (2003), , Discrete Mathematics and Its Applications, CRC Press, с. 65, ISBN , архів оригіналу за 14 липня 2014, процитовано 2 червня 2015.
- Penaloza, Rafael. . Архів оригіналу за 19 жовтня 2012. Процитовано 2 червня 2015.
- (May 2002), All pairs shortest paths using bridging sets and rectangular matrix multiplication, , 49 (3): 289—317, doi:10.1145/567112.567114.
- (January 2010), More algorithms for all-pairs shortest paths in weighted graphs, , 39 (5): 2075—2089, doi:10.1137/08071990x.
Додатково
- Interactive animation of the Floyd–Warshall algorithm [ 25 серпня 2002 у Wayback Machine.]
- The Floyd–Warshall algorithm in C#, as part of QuickGraph [ 21 січня 2018 у Wayback Machine.]
- Visualization of Floyd's algorithm [ 30 травня 2015 у Wayback Machine.]
Це незавершена стаття про алгоритми. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V informatici algoritm Flojda Vorshella sluzhit dlya rozv yazannya zadachi pro najkorotshij shlyah v oriyentovanomu zvazhenomu grafi z dodatnimi abo vid yemnimi vagami reber ale bez negativnih cikliv Algoritm Flojda VorshellaKlasZadacha pro najkorotshij shlyah dlya zvazhenih grafiv Struktura danihGrafNajgirsha shvidkodiyaO V 3 displaystyle O V 3 Najkrasha shvidkodiyaW V 3 displaystyle Omega V 3 Prostorova skladnist u najgirshomu vipadku8 V 2 displaystyle Theta V 2 Pri zvichajnij realizaciyi algoritm povertaye dovzhini sumarni vagi najkorotshih shlyahiv mizh usima parami vershin Modifikaciya algoritmu mozhe takozh povertati informaciyu pro sami shlyahi Rizni versiyi algoritmu takozh vikoristovuyut dlya znahodzhennya tranzitivnogo zamikannya u vidnoshenni R displaystyle R abo dlya znahodzhennya najshirshogo shlyahu mizh usima parami vershin u zvazhenomu grafi napriklad pri vikoristanni metodu Shulce Istoriya i nazvaAlgoritm bulo opublikovano v zvichnij sogodni formi Robertom Flojdom 1962 roku Prote ce praktichno toj samij algoritm sho buv opublikovanij en 1959 roku i Stivenom Vorshellom 1962 roku dlya znahodzhennya tranzitivnogo zamikannya v grafi i ye dosit tisno pov yazanim z en opublikovanim 1956 roku dlya peretvorennya determinovanih skinchennih avtomativ u regulyarni virazi Suchasne formulyuvannya algoritmu yak troh vkladenih cikliv bulo vpershe podano Piterom Ingermanom 1962 roku Algoritm Flojda Vorshella takozh vidomij yak Algoritm Flojda Algoritm Roya Vorshella Algoritm Roya Flojda abo Algoritm WFI AlgoritmCya stattya mistit pravopisni leksichni gramatichni stilistichni abo inshi movni pomilki yaki treba vipraviti Vi mozhete dopomogti vdoskonaliti cyu stattyu pogodivshi yiyi iz chinnimi movnimi standartami lipen 2021 Algoritm Vorshella porivnyuye vsi mozhlivi shlyahi v grafi mizh kozhnoyu paroyu vershin Vin vikonuyetsya za 8 V 3 displaystyle Theta V 3 porivnyan Ce dovoli shvidko vrahovuyuchi sho v grafi mozhe buti do W V 2 displaystyle Omega V 2 reber i kozhnu kombinaciyu bude perevireno Vin vikonuye ce shlyahom postupovogo polipshennya ocinki najkorotshogo shlyahu mizh dvoma vershinami poki ocinka ne staye optimalnoyu Nehaj ye graf G displaystyle G z vershinami V displaystyle V pronumerovanimi vid 1 displaystyle 1 do N displaystyle N Krim togo nehaj ye funkciya s h o r t e s t P a t h i j k textstyle mathrm shortestPath i j k yaka povertaye najkorotshij shlyah vid i displaystyle i do j displaystyle j vikoristovuyuchi vershini z mnozhini 1 2 k displaystyle 1 2 ldots k yak promizhni u shlyahu Mayuchi taku funkciyu nam potribno znajti najkorotshij shlyah vid kozhnogo i displaystyle i do kozhnogo j displaystyle j vikoristovuyuchi lishe vershini z mnozhini 1 2 k 1 displaystyle 1 2 ldots k 1 Dlya kozhnoyi z cih par vershin najkorotshim shlyahom mozhe buti abo 1 shlyah u yakomu ye tilki vershini z mnozhini 1 2 k displaystyle 1 2 ldots k abo 2 shlyah yakij kriz vershini z mnozhini 1 2 k displaystyle 1 2 ldots k prohodit spochatku vid i displaystyle i do k 1 displaystyle k 1 a potim vid k 1 displaystyle k 1 do j displaystyle j Najkorotshij shlyah vid i displaystyle i do j displaystyle j u yakomu ye tilki vershini vid 1 displaystyle 1 do k displaystyle k viznachayetsya funkciyeyu s h o r t e s t P a t h i j k textstyle mathrm shortestPath i j k Yaksho ye korotshij shlyah vid i displaystyle i kriz k 1 displaystyle k 1 do j displaystyle j to dovzhina cogo shlyahu bude sumoyu konkatenaciyeyu najkorotshogo shlyahu vid i displaystyle i do k 1 displaystyle k 1 kriz vershini z 1 2 k displaystyle 1 2 ldots k ta najkorotshogo shlyahu vid k 1 displaystyle k 1 do j displaystyle j takozh kriz vershini z 1 2 k displaystyle 1 2 ldots k Yaksho poznachiti vagu rebra vid i displaystyle i do j displaystyle j cherez w i j displaystyle w i j mozhna viznachiti s h o r t e s t P a t h i j k 1 textstyle mathrm shortestPath i j k 1 nastupnoyu rekurentnoyu formuloyu Baza shortestPath i j 0 w i j displaystyle textrm shortestPath i j 0 w i j rekurentna chastina shortestPath i j k 1 min shortestPath i j k shortestPath i k 1 k shortestPath k 1 j k displaystyle textrm shortestPath i j k 1 min textrm shortestPath i j k textrm shortestPath i k 1 k textrm shortestPath k 1 j k Cya formula ye osnovnoyu chastinoyu algoritmu Flojda Vorshella Algoritm spochatku obchislyuye s h o r t e s t P a t h i j k textstyle mathrm shortestPath i j k dlya vsih par i j displaystyle i j pri k 1 displaystyle k 1 potim pri k 2 displaystyle k 2 i t d Cej proces prodovzhuyetsya do vikonannya umovi k N displaystyle k N vklyuchno v rezultati chogo bude znajdeno vsi najkorotshi shlyahi dlya par i j displaystyle i j kriz bud yaki promizhni vershini Psevdokod dlya ciyeyi versiyi algoritmu 1 let dist be a V V array of minimum distances initialized to infinity 2 for each vertex v 3 dist v v 0 4 for each edge u v 5 dist u v w u v the weight of the edge u v 6 for k from 1 to V 7 for i from 1 to V 8 for j from 1 to V 9 if dist i j gt dist i k dist k j 10 dist i j dist i k dist k j 11 end ifPrikladNavedenij vishe algoritm vikonuyetsya na grafi roztashovanomu livoruch na malyunku nizhche Pered pershoyu iteraciyeyu ciklu tobto pri k 0 displaystyle k 0 usi vidomi shlyahi vidpovidayut odinichnim rebram u grafi Pislya kroku k 1 displaystyle k 1 algoritm znahodit shlyahi yaki prohodyat cherez vershinu 1 displaystyle 1 Zokrema shlyah 2 1 3 displaystyle 2 rightarrow 1 rightarrow 3 zaminit shlyah 2 3 displaystyle 2 rightarrow 3 sho prohodit cherez menshu kilkist reber ale ye dovshim u sensi vagi Pislya k 2 displaystyle k 2 znajdeno shlyahi sho prohodyat cherez vershini 1 2 displaystyle 1 2 Chervoni ta blakitni obvedennya pokazuyut yak shlyah 4 2 1 3 displaystyle 4 rightarrow 2 rightarrow 1 rightarrow 3 skladayetsya zi shlyahiv 4 2 displaystyle 4 rightarrow 2 ta 2 1 3 displaystyle 2 rightarrow 1 rightarrow 3 viznachenih na poperednih iteraciyah Shlyah 4 2 3 displaystyle 4 rightarrow 2 rightarrow 3 ne rozglyadayetsya tomu sho najkorotshim shlyahom vid 2 displaystyle 2 do 3 displaystyle 3 na danomu etapi ye 2 1 3 displaystyle 2 rightarrow 1 rightarrow 3 Pislya k 3 displaystyle k 3 znajdeno shlyahi sho prohodyat cherez 1 2 3 displaystyle 1 2 3 Nareshti pislya k 4 displaystyle k 4 znajdeno vsi najkorotshi shlyahi Pri negativnih ciklahNegativnij cikl ce cikl v yakomu suma vsih reber ye menshoyu za nul Mizh bud yakoyu paroyu vershin i j displaystyle i j sho vhodyat do negativnogo ciklu ne isnuye najkorotshogo shlyahu oskilki dovzhina shlyahu mizh nimi mozhe buti naskilki zavgodno maloyu vid yemnoyu Dlya otrimannya osmislenogo rezultatu algoritm Flojda Vorshella peredbachaye vidsutnist u grafi negativnih cikliv Tim ne mensh yaksho negativni cikli isnuyut algoritm Flojda Vorshella mozhna vikoristati shob viyaviti yih Intuyitivno mozhna navesti nastupni mirkuvannya Algoritm Flojda Vorshella bagatorazovo zminyuye dovzhini shlyahu mizh usima parami vershin i j displaystyle i j vklyuchayuchi ti de i j displaystyle i j Pochatkova dovzhina shlyahu i i displaystyle i i rivna 0 Shlyah i j i displaystyle i rightarrow j rightarrow ldots rightarrow i mozhe pokrashiti pochatkovu dovzhinu yaksho vin maye dovzhinu menshu za nul tobto poznachaye negativnij cikl Takim chinom pislya vikonannya algoritmu najkorotshij shlyah i i displaystyle i i bude vid yemnim yaksho isnuye negativnij cikl shlyah vid yemnoyi dovzhini vid i displaystyle i nazad do i displaystyle i Otzhe dlya viyavlennya negativnih cikliv z vikoristannyam algoritmu Flojda Vorshella mozhna pereviriti diagonal matrici shlyahiv Prisutnist vid yemnogo chisla oznachatime sho grafik mistit shonajmenshe odin negativnij cikl Pid chas vikonannya algoritmu prisutnist negativnogo ciklu mozhe viklikati poyavu chisel yaki na poryadki perevishuyut modul najmenshoyi vid yemnoyi vagi rebra Shob uniknuti problem perepovnennya abo zniknennya poryadku potribno pereviryati diagonal matrici shlyahiv u vnutrishnomu cikli algoritmu Ochevidno sho v neoriyentovanomu grafi negativne rebro stvoryuye negativnij cikl za uchasti prileglih do rebra vershin Yaksho rozglyadati graf z poperednogo prikladu yak neoriyentovanij to poslidovnist reber 4 2 4 displaystyle 4 rightarrow 2 rightarrow 4 utvoryuyut cikl dovzhini 2 displaystyle 2 Znahodzhennya shlyahuAlgoritm Flojda Vorshella zazvichaj znahodit tilki dovzhini shlyahiv mizh usima parami vershin Za dopomogoyu prostih zmin mozhna stvoriti funkciyu dlya vidnovlennya faktichnogo shlyahu mizh bud yakimi dvoma kincevimi tochkami vershin U nayivnomu pidhodi mozhna zberigati shlyah vid kozhnoyi vershini do kozhnoyi vershini ale ce ne obov yazkovo i naspravdi duzhe vitratno shodo pam yati Natomist en mozhe buti obchislenim dlya kozhnoyi vershini za chas 8 E displaystyle Theta E vikoristovuyuchi 8 V displaystyle Theta V pam yati dlya zberezhennya kozhnogo dereva sho dozvolit efektivno vidtvoriti shlyah mizh bud yakimi dvoma z yednanimi vershinami let dist be a V V array of minimum distances initialized to infinity let next be a V V array of vertex indices initialized to null procedure FloydWarshallWithPathReconstruction for each edge u v dist u v w u v the weight of the edge u v next u v v for k from 1 to V standard Floyd Warshall implementation for i from 1 to V for j from 1 to V if dist i k dist k j lt dist i j then dist i j dist i k dist k j next i j next i k procedure Path u v if next u v null then return path u while u v u next u v path append u return pathAnalizNehaj n displaystyle n dorivnyuye kilkosti vershin V displaystyle V Shob znajti usi n 2 displaystyle n 2 znachen s h o r t e s t P a t h i j k textstyle mathrm shortestPath i j k dlya vsih par i j displaystyle i j vihodyachi z vidomih s h o r t e s t P a t h i j k 1 textstyle mathrm shortestPath i j k 1 potribno 2 n 2 displaystyle 2n 2 operacij Oskilki mi pochinayemo z shortestPath i j 0 w i j displaystyle textrm shortestPath i j 0 w i j ta rahuyemo poslidovnist n displaystyle n matric s h o r t e s t P a t h i j 1 s h o r t e s t P a t h i j 2 s h o r t e s t P a t h i j n textstyle mathrm shortestPath i j 1 mathrm shortestPath i j 2 ldots mathrm shortestPath i j n kilkist operacij stanovit n 2 n 2 2 n 3 displaystyle n cdot 2n 2 2n 3 i skladnist algoritmu stanovit 8 n 3 displaystyle Theta n 3 ZastosuvannyaAlgoritm Flojda Vorshella mozhna vikoristovuvati dlya virishennya takih zadach Znahodzhennya najkorotshih shlyahiv u napryamlenomu grafi Znahodzhennya tranzitivnih zamikan u napryamlenomu grafi V originalnomu formulyuvanni Vorshella graf ye nezvazhenij i predstavlenij bulevoyu matriceyu Operaciyi dodavannya i minimumu zamineni na logichni AND i OR Znahodzhennya regulyarnih viraziv sho poznachayut regulyarni gramatiki yaki prijmayutsya skinchennim avtomatom en yakij ye uzagalnennyam algoritmu Flojda Vorshella Nevirodzhenist matrici v metodi Gausa Optimalna marshrutizaciya U takij postanovci zadacha polyagaye u znahodzhenni shlyahu z maksimalnim potokom mizh dvoma vershinami Ce oznachaye sho zamist minimumiv yak u psevdokodi vishe shlyahi optimizuyutsya po maksimumah Vagami reber zadayutsya fiksovani obmezhennya na velichinu potoku Zagalnij potik vzdovzh shlyahu harakterizuyetsya rebrom z najmenshim propuskannyam tomu operaciya dodavannya zaminyuyetsya na vzyattya minimumu Znahodzhennya najdovshogo shlyahu Shvidki obrahunki u en Rozrahunok kanonichnih form en RealizaciyaRealizaciya algoritmu dostupna bagatma movami C v biblioteci boost graph 13 sichnya 2008 u Wayback Machine C v QuickGraph 17 bereznya 2010 u Wayback Machine ta QuickGraphPCL 11 chervnya 2020 u Wayback Machine Java u biblioteci Apache Commons Graph 12 travnya 2013 u Wayback Machine JavaScript u biblioteci en MATLAB u paketi Matlab bgl 17 serpnya 2013 u Wayback Machine Perl v moduli Graph 8 zhovtnya 2013 u Wayback Machine Python v biblioteci NetworkX ta moduli scipy sparse csgraph 11 chervnya 2020 u Wayback Machine biblioteki SciPy R v paketah e1071 27 chervnya 2015 u Wayback Machine ta Rfast 18 lipnya 2020 u Wayback Machine Porivnyannya z inshimi algoritmamiAlgoritm Flojda Vorshella dobre pidhodit dlya obchislennya shlyahu mizh usima parami vershin u shilnih grafah v yakih bilshist abo vsi pari vershin z yednani rebrami Dlya rozridzhenih grafiv z nevid yemnimi vagami reber krashe vikoristovuvati algoritm Dejkstri dlya kozhnoyi mozhlivoyi vihidnoyi vershini oskilki skladnist algoritmu Dejkstri O E V V 2 log V displaystyle O E V V 2 log V z vikoristannyam kupi Fibonachchi ye krashoyu nizh O V 3 displaystyle O V 3 skladnist algoritmu Flojda Vorshella koli E displaystyle E nabagato menshe vid V 2 displaystyle V 2 Dlya rozridzhenih grafiv z negativnimi rebrami ale bez negativnih cikliv mozhe buti vikoristanij algoritm Dzhonsona z tim samim asimptotichnim chasom roboti sho j povtoryuvanij algoritm Dejkstri Ye takozh vidomi algoritmi sho vikoristovuyut shvidke mnozhennya matric dlya prishvidshennya procesu poshuku najkorotshogo shlyahu mizh usima parami vershin u shilnih grafah Prote u nih robitsya dodatkove obmezhennya na vagi reber voni povinni buti malimi cilimi Krim togo cherez visoki stali koeficiyenti u virazi skladnosti voni mozhut zabezpechiti prishvidshennya vidnosno algoritmu Flojda Vorshella lishe dlya duzhe velikih grafiv PosilannyaT Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 25 2 Algoritm Flojda Vorshala Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 Kenneth H Rosen 2003 Discrete Mathematics and Its Applications 5th Edition Addison Wesley ISBN 0 07 119881 4 June 1962 Algorithm 97 Shortest Path Communications of the ACM 5 6 345 doi 10 1145 367766 368168 1959 Transitivite et connexite 249 216 218 Warshall Stephen January 1962 A theorem on Boolean matrices 9 1 11 12 doi 10 1145 321105 321107 Weisstein Eric W Floyd Warshall Algorithm angl na sajti Wolfram MathWorld 1956 Representation of events in nerve nets and finite automata U and J McCarthy red Automata Studies Princeton University Press s 3 42 Ingerman Peter Z November 1962 Algorithm 141 Path Matrix Communications of the ACM 5 11 556 doi 10 1145 368996 369016 Dorit Hochbaum 2014 PDF Lecture Notes for IEOR 266 Graph Algorithms and Network Flows Department of Industrial Engineering and Operations Research University of California Berkeley Arhiv originalu PDF za 20 zhovtnya 2016 Procitovano 2 chervnya 2015 Stefan Hougardy April 2010 Information Processing Letters 110 8 9 279 281 doi 10 1016 j ipl 2010 02 001 Arhiv originalu za 24 veresnya 2015 Procitovano 2 chervnya 2015 Gross Jonathan L Yellen Jay 2003 Discrete Mathematics and Its Applications CRC Press s 65 ISBN 9780203490204 arhiv originalu za 14 lipnya 2014 procitovano 2 chervnya 2015 Penaloza Rafael Arhiv originalu za 19 zhovtnya 2012 Procitovano 2 chervnya 2015 May 2002 All pairs shortest paths using bridging sets and rectangular matrix multiplication 49 3 289 317 doi 10 1145 567112 567114 January 2010 More algorithms for all pairs shortest paths in weighted graphs 39 5 2075 2089 doi 10 1137 08071990x DodatkovoInteractive animation of the Floyd Warshall algorithm 25 serpnya 2002 u Wayback Machine The Floyd Warshall algorithm in C as part of QuickGraph 21 sichnya 2018 u Wayback Machine Visualization of Floyd s algorithm 30 travnya 2015 u Wayback Machine Ce nezavershena stattya pro algoritmi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi