SS241030C. 橋樑(bridge)

liyixin發表於2024-10-30

SS241030C. 橋樑(bridge)

題意

本人小時候也分不清 fridge 和 bridge

給你 \(n\) 個點,\(m\) 條邊的圖,邊帶權。有 \(q\) 個要求。每個要求給出 \(a_i,b_i\),要求至少選中第 \(a_i\)\(b_i\) 條邊。問最小代價選邊使得圖連通。

solution

注意到 \(q\le 16\),可以直接列舉每個要求必須選擇 \(a\) 還是 \(b\),有 \(2^q\) 種選法。

注:以下的 最小生成樹 其實建出來不一定是樹,因為有可能必選的邊會成環。

暴力是跑 \(2^q\) 次最小生成樹。時間複雜度 \(O(n2^q)\),可以得到 \(36pts\)

注意到每次跑生成樹,強制要選的邊變化不多,因此最終選擇出來的邊有很大一部分是重複的。

假設強制選上所有的 \(a_i,b_i\),跑最小生成樹,選上的那些沒有被強制選擇的邊,在所有要求方式中,這些邊一定會被選中,把它們叫做關鍵邊。考慮證明。取消選擇一些 \(a,b\),可能會出現多個連通塊,你可能選擇其他邊替代取消的 \(a,b\),但是這些新邊是無法代替關鍵邊的作用的,因為選上所有 \(a,b\) 的時候,關鍵邊的兩端處在不同的連通塊,所以連上新邊,關鍵邊的兩端仍然處在不同的連通塊。

只連所有的關鍵邊,會形成 \(O(q)\) 個連通塊。

把每個連通塊縮成一個點,處理出它們間的 \(O(q^2)\) 條邊。

列舉要求狀態,然後先選擇必選的邊,然後在 \(O(q)\) 個點,\(O(q^2)\) 條邊的圖上做最小生成樹即可。

錯誤結論 1:沒有要求地跑一遍最小生成樹,沒有跑到的邊一定不會被選中。結論錯誤。

錯誤結論 2:std 的題解說,強制不選擇所有的 \(a_i,b_i\),跑最小生成樹,沒有被選中的邊一定在所有狀態都不會被選中。這個結論是正確的,但是?

時間複雜度 \(O(2^q q^2)\)

程式碼比較醜,不放了。

相關文章