UOJ #704. 馬超戰潼關

275307894a發表於2024-06-26

題面傳送門

顯然題目相當於最小割計數。

考慮一個最大匹配,則一條匹配路徑 \((S,x),(x,y),(y,T)\) 三條邊中肯定要割一條邊掉。因此一個暴力做法是列舉割哪條,然後看 \(S\)\(T\) 是否聯通。

考慮一條不在最大匹配上的邊 \((u,v)\),若 \(u\) 不在最大匹配中,則 \((v,T)\) 必須割,若 \(v\) 不在最大匹配中,則 \((S,u)\) 必須割,否則 \((S,u),(v,T)\) 必須割一條。

抽象一下,每個點可以選 \(0,1,2\),限制是某個點必須選某個數或者 \(u=0,v=2\) 至少要滿足一個。

直接折半可以做到 \(O(3^{\frac{n}{2}}\operatorname{poly}(n))\),但是不牛。考慮一條依次經過匹配邊和非匹配邊的環,則經過的所有匹配邊都不能選,並且所有的匹配選的數要相同,因此可以縮點,然後對於一個限制 \((u,v)\),從 \(u\) 所在的匹配連向 \(v\) 所在的匹配就是一個 DAG。

跑出這個 DAG 的一個拓撲序,這樣就只有前面的點對後面的點有限制,限制形如某個點是否必須選 \(2\)

現在直接搜尋就是 \(O(2^n)\) 的,因為當我們搜到某個位置並確定這個位置的 \(2\) 能不能選的時候,這個位置的 \(2\)\(1\) 是等價的,因此每個點只需要搜尋 \(2\) 種情況。

直接記憶化,前 \(\frac{n}{2}\) 步是 \(O(2^{\frac{n}{2}}n)\) 的,後 \(\frac{n}{2}\) 步因為限制只有 \(2^{n-i}\) 種,所以也是 \(O(2^{\frac{n}{2}}n)\) 的。

可以去掉 map 做到 \(O(2^{\frac{n}{2}})\),但是實測前面的跑得更快,感性上 map 其實去除了更多的無用狀態,前面 \(\frac{n}{2}\) 的搜尋如果在同一個聯通塊中肯定有比較強的限制,複雜度應該是低於 \(O(1.414^n)\) 的。

submission

相關文章