Знайдіть найкоротші шляхи у зваженому уніпатичному графіку


12

Кажуть, що спрямований графік є однопатичним, якщо для будь-яких двох вершин u і v у графі G=(V,E) існує максимум один простий шлях від u до v .

Припустимо, мені дають уніпатичний графік G такий, що кожен край має позитивну чи негативну вагу, але не містить негативних циклів ваги.

З цього я хочу знайти алгоритм O(|V|) , який знаходить усі найкоротші шляхи до всіх вузлів від вихідного вузла s .

Я не впевнений, як би я підходив до цієї проблеми. Я намагаюся зрозуміти, як я міг би використати той факт, що він не містить негативних циклів ваги, і, звичайно, максимум один простий шлях між будь-яким вузлом u до v .


1
Що ви пробували поки що? Якщо ви повністю застрягли, почніть з малого: як насправді виглядають уніпатичні графіки? Наприклад, намалюйте кожен уніпатичний графік однією вершиною, двома вершинами, трьома вершинами тощо. Ви можете помітити корисну схему. Крім того, ви згадаєте, що немає негативних циклів ваги - чи можуть бути навіть цикли (будь-якої ваги)?
Джухо

@mrm Яку модель ти думаєш? Уніпатичні графіки можуть мати цикли в обмеженому вигляді, який я не можу знайти простий спосіб виразити.
Жил "ТАК - перестань бути злим"

@mrm Ні. Край може належати щонайменше одному циклу. Вузол може належати до будь-якої кількості циклів: графік позначеної зірки E = i n { ( a , b i ) , ( b i , a ) } є однопатичним (і ви можете отримати ще вищий відношення елементарних циклів на вузол). nE=in{(a,bi),(bi,a)}
Жил "ТАК - перестань бути злим"

Відповіді:


10

Виберіть представлення даних

Спочатку подивіться на розмір результату. Ви хочете зібрати найкоротші шляхи від до кожного іншого вузла. Якщо середня довжина шляху не обмежена константою (якої немає: будь-який список Unipath, а якщо взяти корінь для S загальна довжина шляхів в п ( п - 1 ) / 2 , де п є довжина списку), вам потрібно бути обережним у поданні даних: структура, що містить шляхи, повинна використовувати обмін між шляхами.ssn(n1)/2n

Виключаючи цикли, існує один шлях від до будь-якого іншого вузла u . Якщо цей шлях проходить через проміжний вузол t , то перший відрізок шляху - це бажаний шлях від s до t . sutst

Я пропоную зберігати результат у масиві, індексованому вузлами, пронумерованими від до | Е | - 1 , при s = 0 . Кожен елемент масиву зберігає індекс попереднього вузла на шляху до цього вузла (використовуйте напр. - 1 як спеціальний маркер для вузлів, недоступних для s ). Шлях від s до t буде ( s = R [ R [ t ] ] , , R [ R [ t0|E|1s=01sst .(s=R[R[t]],,R[R[t]],R[t],t)

Обведіть графік

Ініціалізуйте для всіх - 1 .R1

Виконайте обхід графіка в глибині першої чи першої ширини, починаючи з . Щоразу, коли досягається вузол u , встановіть R [ u ] на свого попередника.suR[u]

Оскільки існують цикли, до вузла може бути досягнуто не раз. Наявність вказує на те, що ви вже відвідали.R[u]1u

Доведіть правильність

Через властивість unipathic не має значення, яким чином ми досягнемо кожного вузла, якщо ми не завершили цикл. Є лише один простий шлях.

Доведіть складність

Алгоритм може досягати кожного вузла не один раз, тому не зрозуміло, що його складність становить . Проведена робота насправді Θ ( | E 0 | ), де V 0 - ребра, доступні від джерела. Точніше, ми дістаємося до вузла не раз лише за однієї обставини: якщо вузол є першим, до якого ми досягаємо певного циклу, і в цьому випадку ми дістаємось до нього двічі (один раз із простого шляху та один раз після завершення циклу ).O(|V|)Θ(|E0|)V0

Ну гаразд. Доведемо, що в уніпатичному графіку кількість елементарних циклів зростає щонайбільше лінійно з кількістю вузлів. (Елементарний цикл - це той, який не містить коротший цикл.) У наступному обговоренні я припускаю, що графік не має власного краю (немає ребра від вузла до себе; такі ребра не мають значення для побудови шляху в будь-якому випадку ).

Уніпатичні графіки можуть мати цикли, але дуже обмеженим чином. Було б добре, якби ми могли якось пов’язати кожен цикл з окремим вузлом (або принаймні, щонайменше обмеженою кількістю циклів на вузол). Чи можуть цикли спільно використовувати вузол? На жаль, так.

maabii,abi

Тож нам потрібно буде працювати більше. Що ж, спробуємо довести це індуктивно. Нехай - кількість вузлів у графі , кількість ребер і кількість елементарних циклів, які не є самостійними ребрами. Я стверджую, що якщо однопатичний і не порожній, то .#V(G)G#E(G)#C(G)G#C(G)#V(G)1

Для графіка з одним або двома вузлами це очевидно. Припустимо, твердження справедливо для всіх графіків таким, що і нехай є уніпатичним графіком з вузлами. Якщо не має циклу, , регістр закритий. Інакше нехай є елементарним циклом.#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

Згорнути цикл: нехай - графік, вузлами якого є мінус плюс вузол і у ребер якого всі ребра не включають , плюс щоразу, коли і коли . Кожен шлях у індукує шлях у (якщо шлях включає , замініть це наGG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacbaiai+1ajc в ). Тому є однопатичним. Крім того, оскільки цикли в не ділять ребра, має всі цикли в крім того, який ми усунули: . За індукцією . Оскільки , маємо .GGGGG#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

На цьому завершується доказ. Обхід проходить не більше ребер.2|V|2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.