Виберіть представлення даних
Спочатку подивіться на розмір результату. Ви хочете зібрати найкоротші шляхи від до кожного іншого вузла. Якщо середня довжина шляху не обмежена константою (якої немає: будь-який список Unipath, а якщо взяти корінь для S загальна довжина шляхів в п ( п - 1 ) / 2 , де п є довжина списку), вам потрібно бути обережним у поданні даних: структура, що містить шляхи, повинна використовувати обмін між шляхами.ssn(n−1)/2n
Виключаючи цикли, існує один шлях від до будь-якого іншого вузла u . Якщо цей шлях проходить через проміжний вузол t , то перший відрізок шляху - це бажаний шлях від s до t . sutst
Я пропоную зберігати результат у масиві, індексованому вузлами, пронумерованими від до | Е | - 1 , при s = 0 . Кожен елемент масиву зберігає індекс попереднього вузла на шляху до цього вузла (використовуйте напр. - 1 як спеціальний маркер для вузлів, недоступних для s ). Шлях від s до t буде ( s = R [ … R [ t ] … ] , … , R [ R [ t0|E|−1s=0−1sst .(s=R[…R[t]…],…,R[R[t]],R[t],t)
Обведіть графік
Ініціалізуйте для всіх - 1 .R−1
Виконайте обхід графіка в глибині першої чи першої ширини, починаючи з . Щоразу, коли досягається вузол u , встановіть R [ u ] на свого попередника.suR[u]
Оскільки існують цикли, до вузла може бути досягнуто не раз. Наявність вказує на те, що ви вже відвідали.R[u]≠−1u
Доведіть правильність
Через властивість unipathic не має значення, яким чином ми досягнемо кожного вузла, якщо ми не завершили цикл. Є лише один простий шлях.
Доведіть складність
Алгоритм може досягати кожного вузла не один раз, тому не зрозуміло, що його складність становить . Проведена робота насправді Θ ( | E 0 | ), де V 0 - ребра, доступні від джерела. Точніше, ми дістаємося до вузла не раз лише за однієї обставини: якщо вузол є першим, до якого ми досягаємо певного циклу, і в цьому випадку ми дістаємось до нього двічі (один раз із простого шляху та один раз після завершення циклу ).O(|V|)Θ(|E0|)V0
Ну гаразд. Доведемо, що в уніпатичному графіку кількість елементарних циклів зростає щонайбільше лінійно з кількістю вузлів. (Елементарний цикл - це той, який не містить коротший цикл.) У наступному обговоренні я припускаю, що графік не має власного краю (немає ребра від вузла до себе; такі ребра не мають значення для побудови шляху в будь-якому випадку ).
Уніпатичні графіки можуть мати цикли, але дуже обмеженим чином. Було б добре, якби ми могли якось пов’язати кожен цикл з окремим вузлом (або принаймні, щонайменше обмеженою кількістю циклів на вузол). Чи можуть цикли спільно використовувати вузол? На жаль, так.
maabi∀i,a⇆bi
Тож нам потрібно буде працювати більше. Що ж, спробуємо довести це індуктивно. Нехай - кількість вузлів у графі , кількість ребер і кількість елементарних циклів, які не є самостійними ребрами. Я стверджую, що якщо однопатичний і не порожній, то .#V(G)G#E(G)#C(G)G#C(G)≤#V(G)−1
Для графіка з одним або двома вузлами це очевидно. Припустимо, твердження справедливо для всіх графіків таким, що і нехай є уніпатичним графіком з вузлами. Якщо не має циклу, , регістр закритий. Інакше нехай є елементарним циклом.#V(G)<nGnG0=#C(G)<#V(G)(a1,…,am)
Згорнути цикл: нехай - графік, вузлами якого є мінус плюс вузол і у ребер якого всі ребра не включають , плюс щоразу, коли і коли . Кожен шлях у індукує шлях у (якщо шлях включає , замініть це наG′G{a1,…,am}aGaia→G′b∃i,ai→Gbb→G′a∃i,b→GaiG′Gb→a→cb→ai→ai+1→…→aj→c в ). Тому є однопатичним. Крім того, оскільки цикли в не ділять ребра, має всі цикли в крім того, який ми усунули: . За індукцією . Оскільки , маємо .GG′GG′G#C(G′)=#C(G)−1#C(G′)≤#V(G′)−1#V(G′)=#V(G)−m+1#C(G)=#C(G′)+1≤#V(G)−m=n−m≤n−1
На цьому завершується доказ. Обхід проходить не більше ребер.2|V|−2