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


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=⋃i≤n{(a,bi),(bi,a)}
— Жил "ТАК - перестань бути злим"

Відповіді:


10

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

Спочатку подивіться на розмір результату. Ви хочете зібрати найкоротші шляхи від до кожного іншого вузла. Якщо середня довжина шляху не обмежена константою (якої немає: будь-який список 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

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