1. 程式人生 > 其它 >AcWing 396 礦場搭建

AcWing 396 礦場搭建

題目傳送門

一、解題思路

首先容易想到割點,因為刪去割點後,分割出的兩個或以上的點雙聯通分量中,每一個都至少要有一個救援出口。而且在最優方案裡,割點上是不能夠設定救援出口的。所以演算法是顯然的:用\(Tarjan\)雙連通分量

首先求出所有割點。有一個坑點:如果根本就沒有割點,那麼這個點雙聯通分量中,至少要有兩個救援出口,而且每個都可以被選擇,這時的選擇方案數是\(C_{size}^2\)種,即\(1/2*size*(size−1)\)種。

下面討論有割點的情況。

如果某點雙連通分量連線的割點只有一個,那麼該雙連通分量裡必須設定一個救援出口,方案數是sizesize。

如果某點雙連通分量連線的割點有兩個或以上,那麼刪去其中一個割點後,必然還剩下一些與之相連割點,這個時候只要剩下的割點連線的點雙連通分量中有救援出口,它就可以利用它們的救援出口,因此這個點雙連通分量中是不需要設定出口的。

在DFS求出點雙連通分量時順便求出連線的割點數即可。最後的方案數採用乘法原理處理。