原題連結
題解
樸素做法:
每次詢問,二分最小邊,然後bfs遍歷檢視是否能到達,時間複雜度 \(O(q\cdot logn\cdot m )\)
最佳化:
如果答案裡的最小邊是 \(k\) ,那麼代表所有邊權不小於 \(k\) 的邊都可以使用,因此可以直接從大到小加入邊,直至起點與終點連線
時間複雜度 \(O(q\cdot m \cdot logm )\)
這個做法雖然沒有最佳化多少,但是這個思想給了我們啟發,因為這個過程有點像求最大生成樹的過程(並查集做法,這裡的最大生成樹是指樹中最小的邊最大)
而對於每一次查詢,其實最大生成樹是一樣的,因此我們只需要在查詢前求一次最大生成樹,並用帶權並查集維護距離
時間複雜度 \(O(q+mlogm)\)
code