Ви можете спробувати зробити версію Floyd-Warshall, яка швидша на рідких матрицях.
Спочатку згадаймо, що робить цей алгоритм:
Нехай - матриця відстаней. На початку алгоритму M i , j - вага ребра i → j . Якщо цього краю не існує, тоді M i , j = ∞ .MMi,ji→jMi,j=∞
Алгоритм має кроків. На кроці k алгоритму для кожної пари вузлів i , j ми встановимоVki,j
Mi,j←min{Mi,j,Mi,k+Mk,j}.
Зрозуміло, що якщо або то оновлення не потрібно проводити. Таким чином, на перших кроках алгоритму нам потрібно лише виконати грубо порівняння, де і позначають кількість вхідних та вихідних ребер -го вузла відповідно. По мірі просування алгоритму заповнюється все більше записів матриціОтже, останні кроки можуть зайняти набагато більше часу.M k , j = ∞ d e g i n ( k ) ⋅ d e g o u t ( k ) d e g i n ( k ) d e g o u t ( k ) k MMi,k=∞Mk,j=∞degin(k)⋅degout(k)degin(k)degout(k)kM
k
E=O(V)k=0O(1)MO(V)k=|V|O(V2)O(V3)