Кількість шляхів фіксованої довжини / Найкоротші шляхи фіксованої довжини
Ця стаття описує розв'язки двох задач, що ґрунтуються на одній і тій самій ідеї: звести задачу до побудови матриці й обчислити відповідь за допомогою звичайного множення матриць або його модифікованого варіанта.
- Довжина шляху задана й фіксована (часто велика), а потрібна кількість або мінімальна вага шляхів рівно з ребер? (якщо не фіксоване, а потрібен звичайний найкоротший шлях → Дейкстра / Беллман-Форд)
- Кількість вершин мала, щоб витримати через бінарне піднесення матриці до степеня?
- Шляхи можуть бути непростими (вершини й ребра дозволено повторювати)?
Кількість шляхів фіксованої довжини
Нам задано орієнтований незважений граф із вершинами, а також ціле число . Задача така: для кожної пари вершин потрібно знайти кількість шляхів довжини між цими вершинами. Шляхи не обов'язково прості, тобто вершини та ребра можна відвідувати будь-яку кількість разів у межах одного шляху.
Вважаємо, що граф задано матрицею суміжності, тобто матрицею розміру , де кожен елемент дорівнює , якщо вершина з'єднана з ребром, і , якщо вони ребром не з'єднані. Наведений алгоритм працює також у випадку кратних ребер: якщо деяка пара вершин з'єднана ребрами, то це можна записати в матриці суміжності, поклавши . Також алгоритм працює, якщо граф містить петлі (петля — це ребро, що з'єднує вершину саму із собою).
Очевидно, що побудована матриця суміжності і є відповіддю на задачу для випадку . Вона містить кількість шляхів довжини між кожною парою вершин.
Будуватимемо розв'язок ітеративно: припустимо, що ми знаємо відповідь для деякого . Тут ми опишемо, як можна побудувати відповідь для . Позначимо через матрицю для випадку , а через — матрицю, яку ми хочемо побудувати. За допомогою такої формули ми можемо обчислити кожен елемент :
Легко бачити, що ця формула обчислює не що інше, як добуток матриць і :
Отже, розв'язок задачі можна подати так:
Залишається зауважити, що добутки матриць можна ефективно підносити до високого степеня за допомогою бінарного піднесення до степеня. Це дає розв'язок зі складністю .
Найкоротші шляхи фіксованої довжини
Нам задано орієнтований зважений граф із вершинами та ціле число . Для кожної пари вершин потрібно знайти довжину найкоротшого шляху між та , що складається рівно з ребер.
Вважаємо, що граф задано матрицею суміжності, тобто матрицею розміру , де кожен елемент містить довжину ребра від вершини до вершини . Якщо ребра між двома вершинами немає, то відповідному елементу матриці присвоюється нескінченність .
Очевидно, що в такому вигляді матриця суміжності і є відповіддю на задачу для . Вона містить довжини найкоротших шляхів між кожною парою вершин або , якщо шляху з одного ребра не існує.
І знову ми можемо будувати розв'язок задачі ітеративно: припустимо, що ми знаємо відповідь для деякого . Покажемо, як можна обчислити відповідь для . Позначимо через матрицю для , а через — матрицю, яку ми хочемо побудувати. Тоді така формула обчислює кожен елемент :
Придивившись до цієї формули уважніше, можемо провести аналогію з множенням матриць: насправді матриця множиться на матрицю , з єдиною відмінністю — в операції множення ми беремо мінімум замість суми, а суму як внутрішню операцію замість множення.
де операцію означено так:
Таким чином, розв'язок задачі можна подати за допомогою модифікованого множення:
Залишається зауважити, що це піднесення до степеня ми так само можемо обчислити ефективно за допомогою бінарного піднесення до степеня, оскільки модифіковане множення, очевидно, асоціативне. Отже, цей розв'язок теж має складність .
Узагальнення задач для шляхів довжини щонайбільше
Наведені вище розв'язки розв'язують задачі для фіксованого . Однак їх можна пристосувати для розв'язання задач, у яких шляхам дозволено містити не більш ніж ребер.
Це можна зробити, дещо змінивши вхідний граф.
Ми дублюємо кожну вершину: для кожної вершини ми створюємо ще одну вершину та додаємо ребро і петлю . Кількість шляхів між та з не більш ніж ребрами дорівнює кількості шляхів між та рівно з ребрами, оскільки існує бієкція, яка зіставляє кожному шляху довжини шлях довжини .
Той самий прийом можна застосувати для обчислення найкоротших шляхів із не більш ніж ребрами. Ми знову дублюємо кожну вершину й додаємо два згадані ребра з вагою .