Схоже , ваша проблема в . Ось алгоритм.NL
По-перше, недетерміновано здогадується шлях від до t . Якщо ви здогадалися неправильно, відхиліть . Назвіть цей алгоритм A .стА
Розглянемо наступний недетермінований алгоритм , який визначає, чи є принаймні два шляхи. Давши графік і s , t , для всіх пар різних країв e , f відгадайте шлях від s до t, що включає e, але не f , а потім вгадайте шлях від s до t, що включає f, але не e . Якщо здогадки вірні, прийміть . Якщо для всіх варіантів e і f не відбувається прийняття , відхиліть . Примітка BБс , те , фстеfстfееfБ реалізується в недетермінованому просторі журналів.
Тепер множина - це безліч s - t графіків, що мають принаймні два шляхи від s до t . Оскільки N L = c o N L , доповнення B також знаходиться в N L , тобто ми можемо визначити, якщо s і t мають менше двох шляхів, у недетермінованому просторі журналів.L ( B )стстNL = c o NLБNLст
Остаточний алгоритм: "Виконати Якщо А приймає, то запустіть додаток B і виведіть його відповідь."ААБ
Я не знаю посилання.
ОНОВЛЕННЯ: Якщо ви дійсно хочете посилання, перегляньте перший абзац розділу 3 цього документу . Але це, мабуть, лише одна з багатьох посилань, які цитують цей наслідок. Було б розумніше назвати результат "фольклором", а не цитувати папір, який трапляється згадувати.
ОНОВЛЕННЯ 2: Припустимо, ви хочете визначити, чи існує унікальний простий шлях. У такому випадку алгоритм не повинен змінюватися: якщо шлях взагалі є, то існує простий шлях. Я вважаю , що наступна модифікація буде працювати для алгоритму B .АБ
Ми хочемо переписати алгоритм так, щоб він приймав, якщо є щонайменше два простих шляху.Б
Спочатку розглянемо наступний поліноміально-часовий алгоритм проблеми. Знайдіть найкоротший шлях від s до t . Для кожного краю e в P перевірте, чи є інший шлях s - t , який не проходить через e . Якщо ви знайдете такий шлях, тоді прийміть . Якщо ви ніколи не знайдете іншого шляху, тоді відмовтесь . Оскільки P найкоротший, він не має циклу, і якщо є інший шлях, який не використовує деякий край P , то є інший шлях, який є простим і не використовує деякий край PПстеПстеППП. (Цей алгоритм використовується для проблеми "другий найкоротший шлях".)
Ми реалізуємо цей алгоритм . Якби у нас був алгоритм N L для запиту ребер e на фіксованому шляху P , ми могли б реалізувати вищезазначене у недетермінованому просторі журналів: ітерація через усі ребра e в P , вгадайте шлях s - t і перевірте, що для кожного краю, відвіданого вздовж Таким чином, жодна з них не дорівнює e .NLNLеПеПсте
Отже, нам потрібен "oracle oracle", алгоритм зі властивістю: заданий i = 1 , ... , n , у кожному обчислювальному шляху алгоритм або повідомляє i- й край на певному фіксованому s - t шляху, або відкинути . Ми можемо отримати оракул шляху, використовуючи N L = c o N L для виділення лексикографічно першого шляху.NLi = 1 , … , niстNL = c o NL
Ось ескіз оракула шляху.
Знайти , довжина найкоротшого шляху від S до т , намагаючись все до = 1 , ... , п і використовуючи N L = C ущільнювача N L .кстk = 1 , … , nNL = c o NL
Встановити змінні , x : = 1 , j : = k .u : = sх : = 1j : = k
Для всіх сусідів з U в лексикографічному порядку,vу
Визначте, чи існує шлях від до t довжиною j - 1 (використовуючи результат N L = c o N L ). Точніше, запустіть недетермінований алгоритм для s - t підключення (довжини j - 1 ) та алгоритм його доповнення одночасно. Коли один з них приймає, перейдіть із його відповіддю (він повинен бути правильним; обидва не можуть прийняти). Якщо обидва відхилити, то відхиліть .vтj - 1NL = c o NLстj - 1
Якщо шляху немає, переходите до наступного сусіда. Якщо ви виснажили всіх сусідів, тоді відмовтеся .
Якщо є шлях, то якщо , виведіть ( u , v ) як i- й край на шляху від s до t . В іншому випадку збільшення x , decrement j , встановіть u : = v , і знову запустіть цикл for, якщо v ≠ t .x=i(u,v)istxju:=vv≠t
Якщо після досягнення t виходу погано, я (заданий я був занадто великим).x<itii
Враховуючи , цей алгоритм або виводить i- й край на лексикографічно найкоротшому шляху P від s до t , або відхиляє.iiPst