Berikut ini (upaya at) algoritma polinomial-waktu untuk LMC pada sewenang-wenang biner DAGs .G
Ini menjawab Pertanyaan # 3. (Maaf atas penulisan yang berantakan sebelumnya. :))
Untuk memulai, buang "selamanya" titik mana pun yang tidak dapat dijangkau dari . Kami tidak peduli tentang ini, karena mereka bukan bagian dari jalur s - t .sst
Selanjutnya, tentukan sub-DAG dan B , yang awalnya kosong. Kemudian, untuk semua simpul v ∈ G - { s , t } ,ABv∈G−{s,t}
Uji apakah ada jalur dari ke t . Jika demikian, menambahkan v ke A . Jika tidak, tambahkan v ke B .vtvAvB
Biarkan tepi dan B adalah yang diinduksi oleh simpul dalam setiap set (untuk saat ini, abaikan setiap tepi dari s ke A , dari A ke t , dan dari A ke B ; juga perhatikan tidak ada tepi dari B ke t oleh konstruksi).ABsAAtABBt
Kemudian, menghitung penutupan transitif . Yaitu, kita tertarik dalam menemukan beberapa set simpul { a * } yang merupakan "daun" dari sub-DAG A .A{a∗}A
Memperbaiki seperti . Amati bahwa harus ada tepi diarahkan dari sebuah * ke t . Hal ini karena, dengan konstruksi, (i) ada s - t jalan melalui sebuah * , (ii) tidak ada jalur dari sebuah * melalui B , dan (iii) karena A itu sendiri merupakan DAG dan sebuah * adalah daun dari A , tidak ada jalan dari sebuah * melalui titik lain A ke t .a∗a∗tsta∗a∗BAa∗Aa∗At
Sekarang, harus juga ada tepi terarah dari setiap simpul di ke beberapa simpul di B , atau beberapa { a ∗ } memiliki tepi tunggal ke t . Dalam kedua kasus, kami diijinkan untuk menghapus sebuah * → t tepi.{a∗}B{a∗}ta∗→t
Jika = 1, maka baik kita harus menghapus tepi dari yang unik sebuah * → t , atau ada titik awal dalam s - t path yang berisi sebuah * yang memiliki dua jalur untuk t - satu melalui sebuah * dan satu langsung. Dalam hal bahwa kekuatan terus terakhir, kami merekam sebuah * → t dan lanjutkan "mundur rakus" (rincian di bawah ini).|{a∗}|a∗→tsta∗ta∗a∗→t
Jika > 1, maka kita harus menghapus semua tepi dari { a ∗ } → t , atau ada beberapa tepi yang k < | { a ∗ } | sebelumnya dalam penutupan transitif dari A yang memutuskan semua jalur dari s melalui { a ∗ } ke t .|{a∗}|{a∗}→tk<|{a∗}|As{a∗}t
Di sinilah kami menggunakan fakta bahwa grafik adalah DAG biner.G
Pertimbangkan sekumpulan pendahulu . Karena masing-masing dari simpul-simpul ini memiliki derajat paling banyak dua, tepat ada tiga kasus:{a∗}
Kasus 1. Seorang pendahulunya memiliki out-tepi ke beberapa titik di dan out-tepi ke beberapa titik di B .{a∗}B
Dalam hal ini, tidak masalah apakah kita menghapus tepi dari pendahulunya ke titik di atau tepi dari titik di { a ∗ } ke t . Oleh karena itu, kita dapat "melewati" titik ini (dan memeriksa apakah jalur mundur bergabung dengan jalur titik lain di { a ∗ } ).{a∗}{a∗}t{a∗}
Kasus 2. Seorang pendahulu memiliki tepi ke sudut dalam dan pendahulu lain dari { a ∗ } .{a∗}{a∗}
Dalam hal ini, kita harus menghapus kedua tepi dari ke t , atau kita dapat menghapus satu tepi sebelumnya di jalur dari s ke pendahulunya yang memutus kedua jalur.{a∗}ts
Kasus 3. Seorang pendahulu memiliki tepi dua sudut di .{a∗}
Ini identik dengan kasus 2. Tidak masalah apakah kami menghapus salah satu dari tepi pendahulu ini dan tepi lainnya yang sesuai dari ke t , atau kedua tepi dari { a ∗ } ke t . Kami hanya ingin tahu apakah kami dapat memutuskan jalur dari s melalui pendahulu ini ke t dengan satu tepi sebelumnya di jalur dari s ke pendahulunya.{a∗}t{a∗}tsts
Secara keseluruhan, ketika kita memindai mundur melalui pendahulunya dalam penutupan transitif dari , kita dengan rakus dapat melacak pilihan "terbaik sejauh ini". Yaitu, pada setiap langkah, kami memiliki pilihan yang jelas yang melibatkan penghapusan sejumlah tepi, tetapi kami ingin menunggu untuk melihat apakah opsi yang lebih baik tersedia. Setelah opsi yang lebih baik ditemukan, kita bisa "lupa" tentang opsi sebelumnya. Oleh karena itu, pilihan serakah di setiap lapisan pendahulu sudah cukup (selama kita menunggu sampai akhir berkomitmen untuk pilihan apa pun).A
Therefore, with some basic memoization, the time and space complexities of this process appear to be at most O(|E|). This leaves out the fact that, while we can locally/greedily identify when we have found a "cheaper choice," it's a priori unclear which previously-recorded edges to remove. Therefore, we record the order in which we check edges as we go. Upon finding a better option, we repeat the search up to this point in order to find which previously-recorded edges to remove. The total time complexity of this step is O(|E|2) and space complexity O(|E|).
O(|V|⋅(|V|+|E|))O(|V|3)O(|E|2) for the search. The total time is O(|V|2+|E||V|+|V|3+|E|2)=O(|V|3+|E|2).
Upon completing the process, we obtain the minimum set of edges required to disconnect s from t while preserving at least one out-edge of every vertex in the graph (or we discover that a solution is impossible along the way, and abort).