題解 P7100 【[w3R1] 團】
阿新 • • 發佈:2021-07-29
P7100 [w3R1] 團
題目大意:
有一個\(n\)個節點的無向帶權圖,由\(k\)個集合組成,每個集合\(S_i\)中有一些點\(\lbrace(T_1,W_1),(T_2,W_2),...,(T_{\left|S_i\right|},W_{\left|S_i\right|})\rbrace\),集合中的任意兩點都有一條連線\(T_i,T_j\)的無向邊,邊權為\(W_i+W_j\)。我們要求 \(1\) 到 \(i\) 的最短路。
solution:
tf老師說:“圖論題,建完圖後打個模板就行了。”,所以我們考慮如何建圖。
暴力地去想,對於每個集合中的點\(T_i\),我們可以從\(T_i\)
根據樣例建圖如下圖:
時間複雜度爆炸:\(O(k|S_i^2|)\)
所以我們考慮,在每個集合中新添一個虛擬節點\(T_{n+i}\),其點權\(W_{i+n}\)為0,再向其他點\(T_j\)連邊。
如下圖:
時間複雜度:\(O(k|S_i|)\)
正確性證明:
我們舉個例子,原圖中\(3\rightarrow4\)的路徑被拆成了\(3\rightarrow7\rightarrow4\),邊權和仍為\(3\)。我們這個過程的實質就是將一條邊拆成兩條邊。
接下來,我們打上最短路模板 \(\text{dijkstra}\) 堆優化或者\(\text{SPFA}\)
細節處理:
總路徑長有可能超\(\text{int}\),所以要開\(\text{long}\) \(\text{long}\)。\(dis\)陣列要初始化成\(\text{0x3f3f3f3f3f3f3f3f}\)
看到這的同學,可以自己去寫程式碼了(tf口吻)