Mari kita perhatikan versi sederhana dari masalah ini di mana edge tidak berbobot.
Diberikan grafik G, periksa apakah G memiliki siklus.
Diberikan grafik G dan angka k, periksa apakah G memiliki siklus panjang setidaknya k.
Yang pertama mudah dan bisa diselesaikan menggunakan DFS. Yang kedua adalah NP-hard.
Mari kita lihat masalah yang lebih sederhana:
Diberikan grafik G dan dua simpul s dan t, periksa apakah ada jalur sederhana dari s untuk t di G.
Diberikan grafik G dan dua simpul s dan t dan angka k, periksa apakah ada jalur sederhana dari s untuk t di G panjang setidaknya k.
Semua masalah ini memiliki cita rasa yang sama. Yang paling atas mudah sedangkan yang paling bawah NP-hard. Saya akan menjelaskan perbedaan untuk yang terakhir karena lebih sederhana tetapi penjelasan yang sama berlaku untuk pasangan lainnya.
Alasan mengapa yang paling atas itu mudah, sedangkan yang paling bawah bukan karena struktur jawaban untuk masalah-masalah ini.
Pertama-tama mari kita lihat masalah menemukan jalan yang sederhana dan mencoba menyelesaikannya secara rekursif. Jika kita hanya mencoba menyelesaikan masalah ini secara langsung, kita perlu melacak simpul yang telah kita gunakan sejauh ini:
SimplePath(s,t,G):= ada jalan dari s untuk t di G.
SimplePath(s,t,G) iff
s=t atau untuk beberapa u∈G SimplePath(s,u,G−t) dan ut∈G.
Jika kita mencoba untuk menyelesaikan masalah dengan algoritma rekursif naif ini akan memakan waktu eksponensial:
ada banyak kemungkinan secara eksponensial untuk set simpul yang tidak digunakan!
Kita harus lebih pintar.
Mengapa kita mendapatkan banyak kemungkinan secara eksponensial? Karena kami berusaha menemukan jalan yang sederhana dan untuk menegakkan kondisi ini, kami perlu melacak simpul yang tidak digunakan.
OK, jadi mari kita jatuhkan kondisi itu dan lihat di mana kita bisa mendapatkan:
Pertimbangkan masalah menemukan jalan (tidak perlu sederhana) dari s untuk t. Karena jalan tidak perlu sederhana, kita tidak perlu melacak simpul yang tidak digunakan. Dengan kata lain, grafik tidak berubah seiring waktu.
PathG(s,t):= ada jalan dari s untuk t.
PathG(s,t) iff
s=tatau
untuk beberapau∈G PathG(s,t) dan ut∈G.
Tapi kita belum selesai. Masalahnya adalah kita tidak tahu jikaPathG(s,u)
adalah masalah yang lebih kecil dari PathG(s,t). Jadi solusi rekursif ini mungkin berakhir dalam satu lingkaran dan tidak pernah berakhir.
Untuk menghindari ini, kita dapat menambahkan parameter tambahan yang memastikan masalah semakin kecil: jumlah tepi di jalur.
PathG(s,t,k):= ada jalan dari s untuk t dengan paling banyak k ujung-ujungnya.
PathG(s,t,k) iff
k=0 dan s=t atau
k>0 dan untuk beberapa u∈G PathG(s,u,k−1) dan ut∈G.
Sekarang perhatikan bahwa ada jalur sederhana dari s untuk t jika ada jalan dari s untuk t dengan paling banyak nujung-ujungnya. Dengan kata lain:
SimplePath(s,t,G) iff PathG(s,t,n).
Poin-poin penting di sini adalah:
Setiap jalur sederhana (nontrivial) dari s untuk t
terdiri dari jalur sederhana dari s untuk beberapa titik u dan keunggulan ut.
Kita bisa berasumsi itu t tidak muncul di jalur sederhana dari s untuk u.
Kami tidak perlu secara eksplisit menyimpan daftar simpul yang tidak digunakan.
Properti ini memungkinkan kita untuk memiliki rekursi yang cerdas
untuk keberadaan masalah jalur sederhana.
Sekarang ini tidak berlaku untuk masalah menemukan jalur panjang setidaknya k. Kami tidak tahu cara mengurangi masalah menemukan jalur panjang sederhana setidaknyak
ke subproblem yang lebih kecil tanpa menyimpan daftar simpul yang tidak digunakan. Properti itu memungkinkan kita untuk memecahkan masalah keberadaan jalur secara efisien.
Ketika grafik tidak memiliki siklus negatif, mereka memungkinkan kita untuk menyelesaikan keberadaan jalur panjang paling banyak k masalah dan masalah jalur sederhana terpendek efisien.
Namun mereka tidak memiliki keberadaan jalur panjang setidaknya k. Pertimbangkan grafik dengan3 sudut s,u,t.
w(su)=1000,w(st)=1000,w(ut)=10,w(tu)=10. Jalur panjang setidaknya1001 dari s untuk t mengandung u dan jalur panjang setidaknya 1001 dari s untuk u mengandung t. Jadi kita tidak bisa mengurangi instance masalah menjadi instance yang lebih kecil dari masalah tanpa secara eksplisit memberikan daftar simpul yang tidak digunakan.
Dengan kata lain, kita tidak tahu rekursi yang cerdas untuk keberadaan jalur panjang sederhana setidaknya k masalah sementara kita tahu rekursi yang cerdas untuk keberadaan jalan yang sederhana.
Kembali ke bagian terakhir dari pertanyaan Anda, ada masalah dengan argumen Anda.
Memang demikian adanya siklus panjang >k
dapat diselesaikan dalam waktu polinomial untuk setiap perbaikan k (yaitu kbukan bagian dari input). (Mirip dengan bagaimana seseorang dapat memeriksa apakah grafik tidak tertimbang memiliki siklus panjangk
pada waktunya O(nk).)
Namun kapan k merupakan bagian dari input yang tidak dapat digunakan lagi karena waktu berjalan tergantung k dengan cara yang buruk.