Ось (спроба) алгоритм поліноміальний час для БМО на довільне бінарне DAGs .G
Це відповідає на запитання №3. (Вибачте за безладний запис достроково. :))
Для початку викиньте «назавжди» будь-яку вершину, недоступну для . Ми не дбаємо про них, так як вони не є частиною будь-якого - шляху.s tsst
Далі визначте під-DAG-адреси і , спочатку порожні. Потім для всіх вершин ,B v ∈ G - { s , t }ABv∈G−{s,t}
Перевірте, чи є шлях від до . Якщо це так, додайте до . Якщо немає, додайте до .t v A v BvtvAvB
Нехай краї і є тими, що індукуються вершинами в кожному наборі (поки що ігноруйте будь-які ребра від до , від до і від до ; також зауважте, що немає ребер від до від будівництво).B s A A t A B B tABsAAtABBt
Потім обчислити транзитивне замикання . А саме, ми зацікавлені в пошуку деякого безлічі вершин , які є «листя» на суб-DAG .{ a ∗ } AA{a∗}A
Виправте будь-який такий . Зверніть увагу , що повинно бути направлено ребро з в . Це тому, що, будуючи, (i) існує - шлях через , (ii) немає шляхів від до , і (iii) оскільки є сам по собі DAG і - лист , немає шляху від через іншу вершину від до .a ∗ t s t a ∗ a ∗ B A a ∗ A a ∗ A ta∗a∗tsta∗a∗BAa∗Aa∗At
Тепер також має бути спрямований край від кожної вершини в до деякої вершини в , або деякі з мають один край до . У будь-якому випадку ми можемо видалити будь-який край .B { a ∗ } t a ∗ → t{a∗}B{a∗}ta∗→t
Якщо= 1, то або ми повинні видалити край унікальної , або є вершина раніше в шляху - що містить який має два шляхи до - один через і один безпосередньо. У випадку, якщо остання може бути утриманою, ми записуємо і продовжуємо "жадібно назад" (детальніше про це нижче).a ∗ → t|{a∗}|a∗→tt a ∗ t a ∗ a ∗ → tsta∗ta∗a∗→t
Якщо> 1, то ми повинні або видалити всі ребра з , або ще є певна кількість реберраніше при перехідному закритті що відключає всі шляхи від через до .{ a ∗ } → t k < | { a ∗ } | A s { a ∗ } t|{a∗}|{a∗}→tk<|{a∗}|As{a∗}t
Тут ми використовуємо той факт, що графік є двійковим DAG.G
Розглянемо набір попередників . Оскільки кожна з цих вершин має ступінь перевищення, щонайменше, дві, то існує рівно три випадки:{a∗}
Випадок 1. Попередник має через краю до деякої вершини в і через краю до деякої вершини в .B{a∗}B
У цьому випадку не має значення, чи будемо видалити край від попередника до вершини в або край з вершини в до . Тому ми можемо «пропустити минулу» цю вершину (і перевірити, чи зливається шлях назад за допомогою шляху іншої вершини в ).{a∗}{a∗}t{a∗}
Випадок 2. Попередник має вершину вершини у та інший попередник .{a∗}{a∗}
У цьому випадку ми повинні або видалити обидва краї від до , або ми можемо видалити один попередній край на шляху від до попередника, який від’єднує обидва шляху.{a∗}ts
Випадок 3. У попередника є перехід до двох вершин у .{a∗}
Це ідентично випадку 2. Не має значення, чи будемо ми видалити один з ребер цього попередника та відповідні інші ребра від до або обидва ребра з до . Ми просто хочемо знати, чи можемо ми відключити шлях від через цього попередника до з одним краєм раніше на шляху від до попередника.{a∗}t{a∗}tsts
Загалом, коли ми скануємо назад через попередників у перехідному закритті , ми можемо жадібно відслідковувати вибір "найкращих поки що". Тобто, на кожному кроці у нас є очевидний вибір, який передбачає видалення деякої кількості ребер, але ми хочемо почекати, щоб побачити, чи є кращий варіант. Як тільки знайдеться кращий варіант, ми можемо «забути» про попередній варіант. Отже, жадібного вибору на кожному шарі попередників достатньо (до тих пір, поки ми будемо чекати до кінця, щоб взяти на себе будь-який вибір).A
Тому за деякої основної запам'ятовування часові та просторові складності цього процесу виявляються не більше . Це виключає той факт, що, хоча ми можемо локально / жадібно ідентифікувати, коли ми знайшли «дешевший вибір», апріорі незрозуміло, які раніше записані краї потрібно видалити. Тому ми записуємо порядок, у якому перевіряємо ребра під час руху. Знайшовши кращий варіант, ми повторюємо пошук до цього моменту, щоб знайти, які раніше записані краї видалити. Загальна часова складність цього кроку становить а просторова складність .O(|E|)O(|E|2)O(|E|)
Загалом, часова складність становить для ініціалізації, плюс для перехідного закриття плюс для пошук. Загальний час - .O ( | V | 3 )O(|V|⋅(|V|+|E|))O(|V|3)O(|E|2)O(|V|2+|E||V|+|V|3+|E|2)=O(|V|3+|E|2)
Завершуючи процес, ми отримуємо мінімальний набір ребер, необхідний для відключення від , зберігаючи принаймні одну крайку кожної вершини на графіку (або ми виявимо, що рішення на шляху не можливе, і скасувати).тst