bzoj4455 容斥原理 DP 小星星

2021-09-05 12:30:57 字數 3234 閱讀 8863

description

小y是乙個心靈手巧的女孩子,她喜歡手工製作一些小飾品。她有n顆小星星,用m條彩色的細線串了起來,每條細

線連著兩顆小星星。有一天她發現,她的飾品被破壞了,很多細線都被拆掉了。這個飾品只剩下了n?1條細線,但

通過這些細線,這顆小星星還是被串在一起,也就是這些小星星通過這些細線形成了樹。小y找到了這個飾品的設

計圖紙,她想知道現在飾品中的小星星對應著原來圖紙上的哪些小星星。如果現在飾品中兩顆小星星有細線相連,

那麼要求對應的小星星原來的圖紙上也有細線相連。小y想知道有多少種可能的對應方式。只有你告訴了她正確的 答案,她才會把小飾品做為禮物送給你呢。

input

第一行包含個2正整數n,m,表示原來的飾品中小星星的個數和細線的條數。

接下來m行,每行包含2個正整數u,v,表示原來的飾品中小星星u和v通過細線連了起來。

這裡的小星星從1開始標號。保證u≠v,且每對小星星之間最多只有一條細線相連。

接下來n-1行,每行包含個2正整數u,v,表示現在的飾品中小星星u和v通過細線連了起來。 保證這些小星星通過細線可以串在一起。

n<=17,m<=n*(n-1)/2

output

輸出共1行,包含乙個整數表示可能的對應方式的數量。 如果不存在可行的對應方式則輸出0。

sample input

4 3

1 21 3

1 44 1

4 24 3

sample output

題解

感覺…還是乙個很套路的容斥

要你計數合法的對映數列個數,這種玩意一般都是轉化成子集dp然後容斥來做

暴力的想法可以設f[i

][j]

[mas

k]

f[i][j][mask]

f[i][j

][ma

sk]表示樹上第i

ii個點對映到圖中是第j

jj個,並且已經有mas

kmask

mask

這個狀態的點被選取了,轉移是n33

nn^33^n

n33n

的目標把這個3

n3^n

3n降下來,我們去掉第三維的限制會好做很多

設f [i

][j]

f[i][j]

f[i][j

]表示第i

ii個點對映到圖中是第jjj個

顯然的,這樣會出現不合法的方案被計數

合法的對映大小為n

nn,減去至多大小n−1

n-1n−

1,加上至多大小n−2

n-2n−

2…如此容斥,複雜度n32

nn^32^n

n32n

預處理一下乙個點在這個狀態下能轉移到**…卡一下常就過了.

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp(x,y) make_pair(x,y)

#define pll pair

#define pii pair

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int stack[20]

;inline

void

write

(ll x)if(

!x)int top=0;

while

(x)stack[

++top]

=x%10

,x/=10;

while

(top)

putchar

(stack[top--]+

'0');}

inline

void

pr1(

int x)

inline

void

pr2(ll x)

const

int maxn=18;

const

int maxmask=(1

<<17)

;int u1[maxn]

,u2,bin[25]

;int mp[maxn]

[maxn]

,n,m;

struct edgea[

2*maxn]

;int len,last[maxn]

;void

ins(

int x,

int y)

ll f[maxn]

[maxn]

,ans;

//i->j

bool is[maxn]

;//bitset<20> is;

int nxt[maxn]

[maxmask]

[maxn]

;voiddp(

int x,

int fa)}}

void

init()

}void

dfs(

int k,

int ct)

is[k]

=true

;u2|

=bin[k]

;dfs

(k+1

,ct+1)

; is[k]

=false

;u2^

=bin[k]

;dfs

(k+1

,ct);}

intmain()

for(

int i=

1;i++i)

init()

;dfs(1

,0);

pr2(ans)

;return0;

}

BZOJ4455 小星星(動態規劃,容斥)

bzoj 洛谷uoj 題意說簡單點就是給定一張 n 個點的圖和一棵 n 個點的樹,現在要讓圖和樹之間的點一一對應,並且如果樹上存在一條邊,那麼圖上對應的點對之間也要存在邊。我們直接求解顯然很麻煩,一一對應是乙個很不好算的東西。那麼我們先要求並不需要一一對應,隨意對應即可,最後再減掉不合法的方案,這樣...

bzoj1042 DP 容斥原理 硬幣購物

description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s output 每次的方法...

bzoj 3812 狀壓dp 容斥原理

題意 乙個n個點m條邊的有向強連通圖,去掉一些邊使其仍然強連通,求方案數。以前做的題,現在看已經不知道自己在寫什麼了。寫一點題解。如果乙個圖縮點後變成乙個有多個點的dag,那麼這玩意一定不連通。設f i 表示拆邊使集合i強連通的方案數,g i 表示i集合的點縮點後成為奇數個彼此沒有邊的點的方案數,p...