旅行者

最爱丁珰發表於2024-03-17

新方法get

法一:我們考慮最終的答案,一定是從某一個關鍵點 \(A\) 走到另一個關鍵點 \(B\),那我們要找一種最短路徑,保證中途經過兩個關鍵點,而且能夠覆蓋所有的關鍵點對。所以我們考慮把其中一部分關鍵點作為起始點的下一個點,剩下的關鍵點作為終點的上一個點,於是我們建立兩個虛點\(s\)\(t\),從\(s\)出發向第一部分關鍵點連有向邊,從第二部分關鍵點向\(t\)連有向邊,這樣從\(s\)\(t\)的最短路就包含了\(A\)\(B\)兩部分的所有集合點對。然後我們利用事實,若\(i≠j\),則兩者的二進位制位一定有一位不同,透過列舉二進位制位遍歷分組就好了

法二:這就要用到一個比較新的dij的操作了

我們列舉每一條邊\((u,v,w)\),如果我們假設某個關鍵點\(p\)是所有關鍵點裡面到\(u\)最近的一個關鍵點,\(q\)\(v\)到所有關鍵點中最近的一個關鍵點,那麼顯然\(p\)->\(u\)->\(v\)->\(q\)就是一種可能的候選答案。我們列舉所有的邊,顯然就不會漏掉答案,現在的關鍵問題是怎麼求出\(p\)\(q\)

這就要用到dij的一種騷操作了,先求\(p\)。我們把所有關鍵點的\(dis\)初始化為\(0\),其餘的\(dis\)都為正無窮,然後把所有關鍵點先一次性加入優先佇列裡面,然後跑dij就可以了。再求\(q\),這個時候我們在反圖上面跑類似的過程就好了

這種方法一般可以用來解決下面的問題:一個圖上有若干關鍵點,求每個點到任意一個關鍵點的最短距離