Ну, проблема в конце концов. Я оставлю предыдущий ответ, так как он также работает для направленного случая (который является NPC, как ответили на другой вопрос), и покажет, что это F P T по отношению к l .PFPTl
В неориентированном случае это разрешимо, детерминистически с помощью минимального потока затрат (это может не сработать в масштабах, на которые вы ссылаетесь в вопросе, но лучше, чем экспоненциальный алгоритм).
Следующая процедура определит, должно ли какое-либо ребро быть частью выходного графа. Чтобы ответить на исходную задачу, просто переберите все ребра.e=(u,v)∈E
Чтобы создать потоковую сеть, выполните следующие действия:
Шаг 1: Разверните чтобы получить вершину x e, и замените e ребрами ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (они направлены как часть сети потоков), установите их стоимость на 0.exee(u,xe),(xe,u),(v,xe),(xe,v)
Шаг 2: замените каждую вершину , кроме x e , двумя вершинами t - и t + и добавьте ребро ( t - , t + ) . Установите стоимость этих ребер равной 1.txet−t+(t−,t+)
Шаг 3: Заменить каждое ребро ребрами ( a + , b - ) , ( b + , a - ) . Установите стоимость этих ребер равной 0.{a,b}∈E(a+,b−),(b+,a−)
Шаг 4: Добавьте новую вершину и добавьте ребра ( s , y e ) , ( t , y e ) со стоимостью 0.ye(s,ye),(t,ye)
Шаг 5: установите все мощности на 1.
Теперь запустите алгоритм минимального потока затрат, ища поток значения 2 от до y e .xeye
Анализ:
- xeyex e ⇝ t → y exe⇝s→yexe⇝t→ye
- Пути не пересекаются, поскольку для каждой вершины в дуге есть только 1 емкость .( т - , т + )t(t−,t+)
- Возвращенные пути - это два пути, сумма расстояний которых минимальна, и это также стоимость найденного потока. Это позволяет нам добавить в выходной граф или удалить в противном случае.e