題意:乙個n個點m條邊的有向強連通圖,去掉一些邊使其仍然強連通,求方案數。
以前做的題,現在看已經不知道自己在寫什麼了。寫一點題解。
如果乙個圖縮點後變成乙個有多個點的dag,那麼這玩意一定不連通。設f
[i] 表示拆邊使集合i強連通的方案數,g[
i]表示i集合的點縮點後成為奇數個彼此沒有邊的點的方案數,p[
i]表示縮成偶數個彼此沒有邊的點的方案數。對於g
[i] 和 p[
i],列舉所在集合序號最大的點的所屬強連通塊: g[
i]=∑
f[j]
∗p[i
−j]
f[i]
=∑f[
j]∗g
[i−j
] 其中j包含序號最大點。對於f
[i] 可以用總的方案數減縮成有多個點的dag的方案數。
列舉縮點後出度為0的點集至少是多大。
由容斥原理得 f[
i]=2
edge
i+∑(
p[j]
−g[j
])∗2
edge
(i−j
)−>i
#include
#include
#include
using namespace std;
#define mod 1000000007
#define ll long long
#define m (1<<16)+10
#define n 16
int f[m],g[m],p[m];
int cnt[n][m],bir[1100],ed[m];
int rev[m];
int n,m;
int t1,t2;
int main()
for(int i=1;i<(1
<%mod;
p[0]=1;
for(int i=1;i<(1
f[i]=bir[ed[i]];
for(int j=i&(i-1);j;j=(j-1)&i)
}f[i]=(f[i]-g[i])%mod;f[i]=(f[i]+p[i])%mod;
g[i]=(g[i]+f[i])%mod;
}f[(1
<1]=(f[(1
<1]%mod+mod)%mod;
printf("%d\n",f[(1
<1]);
return0;}
bozj2669(容斥 狀壓dp)
一張圖最多8個區域性最小值。dp i j 表示正在填從小到大第i個數,區域性最小值所在的位置已被填的情況為j時的方案數 p i 為區域性最小值所在的位置已被填的情況為j時,所有可以填數的位置數。x為沒被填的區域性最小值,x的周圍都不能填,如果填了x就不是區域性最小值了!所以才會存在可以填數的位置數 ...
CF 449D 題解(狀壓 容斥)
狀壓妙啊.本題的主體思路 狀壓 容斥原理 或狀壓 數字dp 記g i 表示按位與後結果所有位上至少有i個1的方案數 那麼根據容斥原理,ans g 0 g 1 g 2 g 3 g 4 於是如果我們求出了g,就可以求出ans 可是怎麼求出g呢 我們記f i 表示a i i這樣的a的個數,那麼如果i某一位...
bzoj 1076(狀壓dp)(期望dp)
傳送門 題解 dp i j 表示第i輪狀態為j 狀態中為1的位表示當前物品還沒被取走 的最大期望得分。為了防止從無效狀態轉移至有效狀態,採用倒推法,從已知的有效狀態往回推,具體注釋在 中。p.s.不寫memset可以快接近一倍,但是為了思維嚴密性,還是寫乙個,反正都能過 注意 由於吃過的寶物可以再吃...