Кажется, ваша проблема в NL . Вот алгоритм.
Во-первых, недетерминированно угадать путь от s до t . Если вы угадаете неправильно, отклоните . Назовите этот алгоритм A .
Рассмотрим следующий недетерминированный алгоритм , который определяет, существуют ли хотя бы два пути. Учитывая граф и , для всех пар различных ребер угадать путь от до который включает но не , затем угадать путь от до который включает но не . Если догадки верны, примите . Если для всех вариантов и не принято ни одного подтверждения , отклоните . Примечание реализуемо в недетерминированном пространстве журнала.сек , т е , е с т е е с т е е е е ВBs,te,fstefstfeefB
Теперь множество - это множество - графов, по крайней мере с двумя путями из в . Поскольку , дополнение также в , то есть, мы можем определить, и иметь меньше , чем два пути, в недетерминированных logspace.s t s t N L = c o N L B N L s tL(B)ststNL=coNLBNLst
Последний алгоритм: «Запустите Если принимает, запустите дополнение и выведите его ответ».A BAAB
Я не знаю ссылки.
ОБНОВЛЕНИЕ: Если вы действительно хотите ссылку, ознакомьтесь с первым параграфом Раздела 3 этого документа . Но это, вероятно, только одна из многих ссылок, которые ссылаются на это следствие. Было бы более разумно назвать результат "фольклором", а не ссылаться на статью, в которой упоминается об этом.
ОБНОВЛЕНИЕ 2: Предположим, вы хотите определить, существует ли уникальный простой путь. В этом случае алгоритм не должен изменяться: если путь вообще существует, тогда существует простой путь. Я считаю , что следующая модификация будет работать для алгоритма .BAB
Мы хотим переписать алгоритм так, чтобы он принимал, если есть хотя бы два простых пути.B
Сначала рассмотрим следующий алгоритм полиномиального времени для задачи. Найти кратчайший путь от до . Для каждого ребра в проверьте, существует ли другой путь - , который не проходит через . Если вы найдете такой путь, то примите . Если вы никогда не найдете другой путь, то отклоните . Поскольку является самым коротким, у него нет цикла, и если есть другой путь, который не использует какое-либо ребро , то есть другой путь, который прост и не использует какое-то ребросек т е р сек т е Р Р РPstePstePPP, (Этот алгоритм используется для решения проблемы «вторых кратчайших путей».)
Мы будем реализовывать этот алгоритм в . Если бы у нас был алгоритм для запроса ребер в фиксированном пути , мы могли бы реализовать вышеизложенное в недетерминированном логарифмическом пространстве: перебирая все ребра в , угадывая путь - и проверяя его для каждого ребра, посещенного по пути , ни один из них не равен .N L E P e P s t eNLNLePePste
Итак, нам нужен «оракул пути», алгоритм со свойством: учитывая , в каждом пути вычислений алгоритм либо сообщает й фронт на конкретном фиксированном пути - , либо отказаться . Мы можем получить путь оракула, используя чтобы выделить лексикографически первый путь.i = 1 , … , n i s t N L = c o N LNLi=1,…,nistNL=coNL
Вот набросок пути оракула.
Найдите , длину кратчайшего пути от до , попробовав все и используя .s t k = 1 , … , n N L = c o N Lkstk=1,…,nNL=coNL
Установите переменные , , .x : = 1 j : = ku:=sx:=1j:=k
Для всех соседей из в лексикографическом порядке,Uvu
Определите, существует ли путь от до длины (используя результат ). Точнее, запустить недетерминированную алгоритм - связи (длины ) и алгоритм его дополнения, одновременно. Когда один из них принимает, идите с его ответом (он должен быть правильным; оба не могут принять). Если оба отклоняют, то отклоняют .t j - 1 N L =vtj−1NL=coNLstj−1
Если пути нет, переходите к следующему соседу. Если вы исчерпали всех соседей, откажитесь .
Если есть путь, то, если , выведите в качестве го ребра на пути от до . В противном случае увеличьте , уменьшите , установите и снова запустите цикл for, если .( u , v ) i s t x j u : = v v ≠ tx=i(u,v)istxju:=vv≠t
Если после достижения вывод плохой (заданный был слишком большим).т I яx<itii
Учитывая , этот алгоритм либо выводит е ребро по лексикографически кратчайшему пути из в , либо отклоняет.я P S TiiPst