bzoj 3812 狀壓dp 容斥原理

2021-07-22 03:32:57 字數 1271 閱讀 7606

題意:乙個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可以快接近一倍,但是為了思維嚴密性,還是寫乙個,反正都能過 注意 由於吃過的寶物可以再吃...