P1967 [NOIP2013 提高組] 貨車運輸

纯粹的發表於2024-07-31

原題連結

題解

樸素做法:

每次詢問,二分最小邊,然後bfs遍歷檢視是否能到達,時間複雜度 \(O(q\cdot logn\cdot m )\)

最佳化:

如果答案裡的最小邊是 \(k\) ,那麼代表所有邊權不小於 \(k\) 的邊都可以使用,因此可以直接從大到小加入邊,直至起點與終點連線

時間複雜度 \(O(q\cdot m \cdot logm )\)

這個做法雖然沒有最佳化多少,但是這個思想給了我們啟發,因為這個過程有點像求最大生成樹的過程(並查集做法,這裡的最大生成樹是指樹中最小的邊最大)

而對於每一次查詢,其實最大生成樹是一樣的,因此我們只需要在查詢前求一次最大生成樹,並用帶權並查集維護距離

時間複雜度 \(O(q+mlogm)\)

code


相關文章