Masalah ini NP-keras dengan reduksi dari Vertex Cover.
Dalam masalah Vertex Cover, kita diberi grafik dan sejumlah , dan tugas kita adalah untuk menentukan apakah ada beberapa subset paling banyak simpul dari sehingga setiap tepi dalam adalah kejadian pada setidaknya satu titik di . (Setara: Apakah mungkin untuk membunuh setiap sisi dalam dengan menghapus paling banyak simpul?)G=(V,E)rUrVEUGr
Pertama, partisi menjadi himpunan bagian menguraikan setara dengan menugaskan setiap elemen dalam tepat satu dari label mungkin. Ide dasar reduksi adalah untuk membuat label untuk setiap vertex di , dan untuk "memungkinkan" setiap sisi diberi hanya satu dari dua label yang sesuai dengan titik akhir, dalam arti berikut: menetapkan tepi yang sesuai label tidak memperkenalkan batasan (asli) pada tepi mana yang dapat diberi label yang sama, sementara menetapkan tepi pada label yang tidak sesuai mencegah tepi lainnya diberi label yang sama - yang tentu saja memiliki efek mendorong nomor tersebut diperlukan label berbeda.AsAsSjvjV
Untuk membuat instance masalah Anda dari instance Vertex Cover:(A,a,s)(G,r)
- Set ke, Dan menciptakan sebuah elemen di untuk setiap tepi di . (Pasangan-pasangan ini dapat dianggap sebagai bilangan bulat ; setiap penambangan di antara keduanya akan dilakukan.)k|E|(i,j)AvivjE1,…,k
- Set kejika atau ; jika tidak, atur ke 1.a(b,c),d|E|d=bd=ca(b,c),d
- Set .s=r
Jika adalah turunan YA dari Vertex Cover, maka mudah untuk melihat bahwa turunan yang baru saja dibangun dari masalah Anda juga merupakan turunan YA: cukup pilih label sesuai dengan simpul dalam solusi apa pun , dan untuk setiap sisi menetapkan elemen yang sesuai mana yang salah satu dari label atau dipilih (pilih secara sewenang-wenang jika kedua label diambil). Solusi ini menggunakan himpunan bagian , dan valid karena satu-satunya berlaku adalah yang sesuai(G,r)SjvjUvbvc∈E(b,c)∈ASbScsaijlabel, yang memiliki efek (non-) mencegah lebih daritepi diberi label yang sama.|E|
Tetap menunjukkan bahwa YA-instance dari masalah Anda menyiratkan bahwa yang asli adalah instance-YA dari Vertex Cover. Hal ini sedikit lebih rumit, karena solusi yang valid ke mungkin dalam menetapkan umum tepi seorang non label -corresponding , yaitu, , yang berarti bahwa kita tidak bisa tentu "membacakan" penutup simpul yang valid dari solusi yang valid .X=(A,a,s)(G,r)YX(i,j)Smm∉{i,j}UY
Namun, menetapkan label yang tidak sesuai memiliki biaya tinggi yang sangat membatasi struktur solusi: setiap kali tepi diberikan label seperti , dengan , faktanya bahwa memastikan bahwa itu harus menjadi satu - satunya tepi yang ditetapkan label ini. Jadi, dalam setiap solusi mengandung tepi yang tidak berlabel yang sesuai , kita dapat membuat solusi alternatif sebagai berikut:(i,j)Smm∉{i,j}a(i,j),m=1Y(i,j)↦SmY′
- Secara sewenang-wenang pilih label baru untuk sebagai atau .Sz(i,j)SiSj
- Tetapkan label baru ini. Jika ini menghasilkan solusi yang tidak valid, itu pasti karena tepat satu sisi lainnya , telah diberi label . Dalam hal ini, atur dan lanjutkan ke langkah 1.(i,j)(i′,j′)z∉{i′,j′}Sz(i,j)=(i′,j′)
Algoritme di atas harus diakhiri dengan salah satu dari dua cara: label baru ditemukan yang tidak menimbulkan kontradiksi, atau siklus lengkap simpul ditemukan. Dalam kasus sebelumnya, ditemukan solusi baru yang valid dengan set , sedangkan pada kasus yang kedua ditemukan solusi baru yang valid dengan set ; Bagaimanapun, kami telah membangun solusi baru yang valid dengan setidaknya satu keunggulan lagi ditetapkan untuk label yang sesuai . Setelah mengulangi seluruh proses ini paling banyakkali, kami akan menghasilkan solusi yang valid dari mana solusi untuk masalah Vertex Cover asli dapat dibacakan.Szs−1s|E|Y′′
Konstruksi ini jelas merupakan waktu polinomial, sehingga masalah Anda adalah NP-hard.