description
小y是乙個心靈手巧的女孩子,她喜歡手工製作一些小飾品。她有n顆小星星,用m條彩色的細線串了起來,每條細input線連著兩顆小星星。有一天她發現,她的飾品被破壞了,很多細線都被拆掉了。這個飾品只剩下了n?1條細線,但
通過這些細線,這顆小星星還是被串在一起,也就是這些小星星通過這些細線形成了樹。小y找到了這個飾品的設
計圖紙,她想知道現在飾品中的小星星對應著原來圖紙上的哪些小星星。如果現在飾品中兩顆小星星有細線相連,
那麼要求對應的小星星原來的圖紙上也有細線相連。小y想知道有多少種可能的對應方式。只有你告訴了她正確的 答案,她才會把小飾品做為禮物送給你呢。
第一行包含個2正整數n,m,表示原來的飾品中小星星的個數和細線的條數。output接下來m行,每行包含2個正整數u,v,表示原來的飾品中小星星u和v通過細線連了起來。
這裡的小星星從1開始標號。保證u≠v,且每對小星星之間最多只有一條細線相連。
接下來n-1行,每行包含個2正整數u,v,表示現在的飾品中小星星u和v通過細線連了起來。 保證這些小星星通過細線可以串在一起。
n<=17,m<=n*(n-1)/2
輸出共1行,包含乙個整數表示可能的對應方式的數量。 如果不存在可行的對應方式則輸出0。sample input
4 3sample output 題解1 21 3
1 44 1
4 24 3
感覺…還是乙個很套路的容斥要你計數合法的對映數列個數,這種玩意一般都是轉化成子集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...