Nah, masalahnya ada di setelah semua. Aku akan menjaga jawaban sebelumnya karena juga bekerja untuk kasus diarahkan (yang NPC, seperti menjawab pada pertanyaan lain), dan menunjukkan itu adalah F P T sehubungan dengan l .PFPTl
Dalam kasus yang tidak diarahkan, ini dapat dipecahkan, secara deterministik melalui aliran biaya minimum (ini mungkin tidak bekerja pada skala yang Anda maksudkan dalam pertanyaan, tetapi lebih baik daripada algoritma eksponensial.
Prosedur berikut akan memutuskan apakah beberapa sisi harus menjadi bagian dari grafik output. Untuk menjawab masalah awal, lakukan perulangan di semua sisi.e=(u,v)∈E
Untuk membuat jaringan aliran, lakukan hal berikut:
Langkah 1: Perluas untuk memiliki simpul x e dan ganti e dengan tepian ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (mereka diarahkan sebagai bagian dari jaringan aliran), tetapkan biaya ke 0.exee(u,xe),(xe,u),(v,xe),(xe,v)
Langkah 2: ganti setiap simpul , kecuali untuk x e oleh dua simpul t - dan t + , dan tambahkan tepi ( t - , t + ) . Atur biaya tepi ini ke 1.txet−t+(t−,t+)
Langkah 3: Ganti setiap tepi dengan tepi ( a + , b - ) , ( b + , a - ) . Setel biaya tepi ini ke 0.{a,b}∈E(a+,b−),(b+,a−)
Langkah 4: Menambahkan baru vertex dan menambahkan tepi ( s , y e ) , ( t , y e ) dengan biaya 0.ye(s,ye),(t,ye)
Langkah 5: atur semua kapasitas ke 1.
Sekarang jalankan algoritma aliran biaya min, mencari aliran nilai 2 dari ke y e .xeye
Analisis:
- xeyex e ⇝ t → y exe⇝s→yexe⇝t→ye
- Path terpisah, karena untuk setiap simpul hanya ada 1 kapasitas dalam busur .( t - , t + )t(t−,t+)
- Jalur yang dikembalikan adalah dua jalur yang jumlah jaraknya minimal, dan itu juga biaya aliran yang ditemukan. Ini memungkinkan kita untuk menambahkan ke grafik keluaran atau menghapus yang lain.e