Що ж, проблема в зрештою. Я збережу попередню відповідь, оскільки вона також працює для спрямованого випадку (який є 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 ) (вони спрямовані як a частина потокової мережі), встановіть їх вартість 0.exee(u,xe),(xe,u),(v,xe),(xe,v)
txet−t+(t−,t+)
{a,b}∈E(a+,b−),(b+,a−)
ye(s,ye),(t,ye)
Крок 5: встановіть усі ємності на 1.
xeye
Аналіз:
- xeyexe⇝s→yexe⇝t→ye
- Шляхи роз'єднані, оскільки для кожної вершини в дузі є лише 1 ємність .t(t−,t+)
- Повернуті шляхи - це два шляхи, сума відстаней яких мінімальна, і це також вартість знайденого потоку. Це дозволяє нам додати до вихідного графіка або видалити інакше.e