Пошук найкоротших і найдовших шляхів між двома вершинами в DAG


14

З огляду на незважене DAG (спрямований ациклічний графік) та дві вершини і , чи можна знайти найменший і найдовший шлях від до в поліноміальний час? Довжина шляху вимірюється кількістю ребер.s t s tD=(V,A)stst

Мені цікаво знайти діапазон можливих довжин шляху в многочлен.

Пс., Це запитання є дублікатом найдовшого шляху StackOverflow у DAG .

Відповіді:


10

Що стосується проблеми найкоротшого шляху, якщо ми не піклуємося про ваги, то пошук по ширині спочатку - це надійний спосіб. Інакше алгоритм Дейкстри працює до тих пір, поки немає негативних ребер.

Для найдовшого шляху ви завжди можете зробити Беллмана-Форда на графіку з усіма запереченими вагами. Нагадаємо, Bellman-Ford працює до тих пір, поки немає негативних циклів ваги, а тому працює з будь-якими вагами на DAG.


2
Bellman-Ford - це алгоритм динамічного програмування.
Рафаель

1
@Raphael так, але я думаю, що існує прямий алгоритм DP, щоб знайти максимум шляху, замість того, щоб відкидати всі ваги краю.
jmite

1
@jmite: Чому, звичайно, просто змініть Беллмана-Форда, щоб зробити перетворення в Інтернеті, або максимально збільшити, або ...
Рафаель

1
До речі, я не інтуїтивно переконаний, що NP-завершена проблема Найдовший шлях, таким чином, легко потрапляє в P на DAG. Буду вдячний доказ / посилання / пояснення.
Рафаель

2
Також є більш простий та ефективний алгоритм DP для DAG

8

Нехайі. Нехай позначає вагу ребра . Припустимо, ви хочете знайти мінімальну та максимальну вартість шляху від до .m = | E ( G ) | w ( a b ) ( a b ) s tn=|V(G)|m=|E(G)|w(ab)(ab)st

Починаючи з , виконайте наступне:b:=t

  1. Якщо вже відвідано, поверніть уже обчислені та . В іншому випадку позначте як відвідане.bmax ( b ) bmin(b)max(b)b

  2. Визначте і запишіть та наступним чином.max ( b )min(b)max(b)

    • Якщо , збережіть .min ( s ) : = max ( s ) : = 0b=smin(s):=max(s):=0
    • Інший набір ігнорування вершин, для яких . Під час обчислення мінімуму та максимуму на порожньому наборі ребер (відсутні вхідні ребра до взагалі або всі ігноруються), встановіть .
      min(b):=minab[w(ab)+min(a)]max(b):=maxab[w(ab)+max(a)]
      min(a)=max(a)=inaccessiblebmin(b):=max(b):=inaccessible

Ви повинні мати можливість довести, що цей алгоритм працює у часі , нехтуючи часом, необхідним для ініціалізації всіх вершинних змінних.O(m)


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