題目描述
有一張n個節點的無向圖,對於所有 (i,j),判斷 i 和 j 之間是否存在哈密頓路徑
1<=n<=24
哈密頓路徑:經過每個點恰好一次
樂樂樂樂樂
考慮暴力:\(dp[i][j][st]\)表示從\(i\)開始到\(j\)的經過的點的狀態\(st\)(\(st\)狀壓每一個點是否被經過)是否可行
轉移時列舉一個\(k\),類似Floyd,要求\(st\)的並只有\(k\)
複雜度:\(O(n^32^n)\),輕輕鬆鬆TLE(樂)
奇妙性質:對於任意一點\(k\),哈密頓路徑中\(i\)到\(j\)可以拆為\(k\)到\(i\)和\(k\)到\(j\)(如果存在這條路徑,那麼一定經過每一個點)
我們欽定\(1\)為\(k\)點,點對\((i,j)\)的路徑相當於\((i,1)\)和\((1,k)\)兩條路徑拼接得到
設計新dp:\(dp[i][st]\)表示從1出發到\(j\)狀態為\(st\)(\(st\)意義同上)是否可行
轉移列舉下一個點即可
我們最佳化掉了一維,且\(st\)的狀態少一半(不用壓第一個點)
複雜度:\(O(n2^n)\),依然爆炸
取不來小標題
發現dp僅儲存可不可行,浪費了
我們再壓dp:\(dp[st]\)狀態為\(st\)(\(st\)意義同上的上),可以到的點的狀壓(dp狀態、值雖然都是\(2^n\)狀壓,但意義不同)
這樣就是\(O(n2^n)\)了
考慮統計答案
我們要統計\(n^2\)個點對\((i,j)\)是否可行
鴿了