1. 程式人生 > >Hamilton問題的一些假做法和一種真做法

Hamilton問題的一些假做法和一種真做法

Hamilton問題

  Hamilton迴路/路是指從某個點出發,不重複的經過每個點,最後回到起點/隨便停留的路.

  從剛開始學OI買了資訊學一本通,這個問題就常常出現.由於它題面的簡潔性,看起來無比優美的性質和歐拉回路的高度相似性,它看起來很像一個好演算法,可惜,這是一個NP-hard問題.

  因為可能會有不明真相的人點進來看,我首先介紹一下一種真實的做法:狀壓dp,似乎也不需要介紹了,當然搜尋也是可以的,總之都是指數級演算法了.

  但是它卻如幽靈一般給人解決它的希望...見到這種事情已經很多次了,今天決定寫一寫.

  單詞遊戲

  給定$n$個單詞,求一種排列順序使得相連單詞首尾相接.$n<=10^5$

  這道題有兩種解法:

  1.將單詞作為點,如果兩個單詞可以首尾相接,那麼連一條邊,要求不重複的經過每一個點,是一個哈密爾頓路問題,於是這就得到了一個非常優秀的$2^{10^5}$的做法!

  2.將字母作為點,對於每個單詞,將它的尾字母向首字母連邊,要求不重複的經過每一條邊,是一個尤拉路問題,於是這就得到了一個更加優秀的$10^5$的做法!

  這道題深刻的闡述了建圖策略對於時間複雜度的影響,然而...這兩種建圖的複雜度都不是很高,如果可以設法進行一番逆變換,把一個普通圖的哈密爾頓路轉化為這個問題,再轉化為尤拉路做,可以嗎?

  這個想法極大的鼓舞了我,不過經過一段時間的嘗試,我發現這個逆變換實際上是無法在多項式時間內出解的,反向構圖同樣需要指數級時間。

  

  今天學習網路流的時候又看到了一種新的假解法:

  無源匯上下界網路流. 無源匯上下界網路流. 無源匯上下界網路流.

  好高階啊,雖然還是假的.但是這個演算法想要證偽可就不那麼顯然了.

  對於每個點進行拆點限制流量上下界均為為1,對於原有的邊下界為0上界正無窮.

  看起來是不是非常對呀...

  但是這種演算法可能會把明明不符合條件的圖也判斷成滿足條件,為什麼?因為解決無源匯問題時,往往是通過轉化為多源多匯再進一步轉化為超級源匯來解決的,所以求出的可能不是一條路,而是一些無法相連的路。

  至此妄想解決哈密爾頓問題的這個嘗試徹底宣告破產了.

  有的東西就是這樣,看起來好像就差一點了,其實差的很遠,可能總是會覺得還有希望,但其實根本就沒有希望。

  人生是不是也是這樣呢?(語文老師說加上這一句作文就能再高五分)

  ---shzr