小y是乙個心靈手巧的女孩子,她喜歡手工製作一些小飾品。她有n顆小星星,用m條彩色的細線串了起來,每條細線連著兩顆小星星。有一天她發現,她的飾品被破壞了,很多細線都被拆掉了。這個飾品只剩下了n?1條細線,但通過這些細線,這顆小星星還是被串在一起,也就是這些小星星通過這些細線形成了樹。小y找到了這個飾品的設計圖紙,她想知道現在飾品中的小星星對應著原來圖紙上的哪些小星星。如果現在飾品中兩顆小星星有細線相連,那麼要求對應的小星星原來的圖紙上也有細線相連。小y想知道有多少種可能的對應方式。只有你告訴了她正確的答案,她才會把小飾品做為禮物送給你呢。
輸入格式
第一行包含個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
輸出格式
輸出共1行,包含乙個整數表示可能的對應方式的數量。 如果不存在可行的對應方式則輸出0。
樣例樣例輸入
4 3
1 21 3
1 44 1
4 24 3
樣例輸出
6
這個題真的是gg
題目中一點暗示都沒有,我還是憑常年wa題的經驗才把 long long開起來的qaq
真是*****。
考場上我wa了3次,第一次50,錯因應該就是爆int。
第二次我以為我的 tree dp 給wa掉了,改了個限制條件。
第三次我終於意識到 long long 的事情了,但是我沒改限制條件。
第四次我終於ac了。
qaq首先,這個題,特別容易看錯【如果不看樣例的話絕對會理解出錯,比如我。
我一看這個題,覺得是乙個求生成樹的問題。
emmm或者說是通過生成樹倒退原圖的過程。
就在我苦思冥想怎麼做的時候,我瞄了一眼樣例。
qaq 已經給出原圖,給出生成樹了。
??????什麼鬼啊?????????
回去看題面,發現裡面有一句這樣的話:
她想知道現在飾品中的小星星對應著原來圖紙上的哪些小星星。也就是說,剪掉一些線之後,星星的編號變了。
??????什麼意思啊????????
這個時候,我們發現其實每個節點究竟是什麼已經不重要了。
重要的是, 哪兩個點之間有著連線的關係。
所以這題就變成了,給定一些連線關係,求滿足下列關係的組合有多少個?
那麼,很顯然,我們可以直接計算每個點對映之後會形成的方案數。【對於每個位置可選的方案數稱起來就可以了
考慮 dp[ i ][ j ] 在限制s下的含義為: 樹中的點只能對映原圖上屬於集合 s 的點 ,i 點對映到 j 點 在以 i 為根的子樹中的方案。
這個時候,手玩兩組資料,就會發現,多算了。
在對映的時候,有可能把好多個節點都標號成了同乙個。
那麼就需要把這些方案數減去。
然後我就想到了容斥。【可能我本來容斥就學的不錯,一下就想到了
假設,在限制s下的對映方案數為ans[s] ,
只許對映到s且s集合中每個點都被至少對映一次的方案數為 calc [s] 。
那麼顯然的是 : ans[s] = σ calc [t] (其中t是s的乙個子集)。
所以我們容斥從小到大計算出calc,最後calc[2^n-1]就是答案。
#include#include#include
#include
#include
#include
#define ll long long
#define rint register int
using
namespace
std;
ll n,m,num;
ll a[
20][20],c[30],cnt[20
];ll f[
20][20],ans[140005];//
ans表示選點集合只能是s子集的方案數
vectorv[20
];void
dp(ll x,ll fa) }}
return;}
intmain()
for(rint i=1;i)
c[0]=1
;
for(rint i=1;i<=20;i++)
c[i]=c[i-1]<<1
;
for(rint i=1;i)
for(rint i=1;i)
for(rint j=(i-1)&i;j;j=(j-1)&i)
ans[i]-=ans[j];
cout
<1]
}
生氣了,所以全部longlong!!!!!!
ZJOI2016 小星星(容斥 dp)
題意相當於給一棵樹重新賦予彼此不同的編號,要求樹上相鄰的兩個節點在給定的另外乙個無向圖中也存在邊相連。n很小,但列舉階乘肯定是會 的。發現編號彼此不同對統計答案的影響太大了,我們可以嘗試先讓編號可以重複,但是限制可以選用的編號集,即o 2 n 列舉n個數的子集,然後容斥一下答案。可選用的編號集合確定...
小星星 子集反演 容斥
小 y 是乙個心靈手巧的女孩子,她喜歡手工製作一些小飾品。她有 n 顆小星星,用 m 條彩色的細線串了起來,每條細線連著兩顆小星星。有一天她發現,她的飾品被破壞了,很多細線都被拆掉了。這個飾品只剩下了 n 1 條細線,但通過這些細線,這顆小星星還是被串在一起,也就是這些小星星通過這些細線形成了樹。小...
bzoj4455 容斥原理 DP 小星星
description 小y是乙個心靈手巧的女孩子,她喜歡手工製作一些小飾品。她有n顆小星星,用m條彩色的細線串了起來,每條細 線連著兩顆小星星。有一天她發現,她的飾品被破壞了,很多細線都被拆掉了。這個飾品只剩下了n?1條細線,但 通過這些細線,這顆小星星還是被串在一起,也就是這些小星星通過這些細線...