乙個有 n 個節點的樹,設它的節點分別為 v1,
v2,…
,v
nv_1,v_2,\ldots,v_n
v1,v2
,…,
vn,已知第 i 個節點 v
iv_i
vi 的度數為 d
id_i
di,問滿足這樣的條件的不同的樹有多少棵
有關樹的形態計數,考慮prufer序列
每個prufer序列對應乙個無根樹,如果可以求得prufer序列方案數即得到答案
每個度數為d
dd的點u
uu在prufer序列**現d−1
d - 1
d−1次,序列長度為n−2
n - 2
n−2
根據可重全排列公式可以得到方案數為(n−
2)!π
i=1n
(di−
1)
\frac^(d_i - 1)}
πi=1n
(di
−1)(
n−2)
!,其中d
id_i
di表示第i個點的度數
注意特判無解情況:
#include
using
namespace std;
inline
intread()
while
(ch >=
'0'&& ch <=
'9')
return s * w;
}const
int maxn =
150+50;
const
int maxm =
1e7+10;
int n,ans,sum;
int d[maxn]
,jc[maxm]
;int
main()
; sum +
= d[i]-1
;}jc[0]
=1;for
(int i =
1; i <= n ; i ++
) jc[i]
= jc[i -1]
* i;
if(sum != n -2)
; ans =1;
int j =1;
for(
int i =
1; i <= n -
2; i ++)}
cout << ans << endl;
return0;
}
洛谷 P2290 HNOI2004 樹的計數
輸入格式 輸入檔案第一行是乙個正整數n,表示樹有n個結點。第二行有n個數,第i個數表示di,即樹的第i個結點的度數。其中1 n 150,輸入資料保證滿足條件的樹不超過10 17個。輸出格式 輸出滿足條件的樹有多少棵。輸入樣例 1 4 2 1 2 1 輸出樣例 1 2題解 質因數分解 prufer數列...
題解 P2285 HNOI2004 打鼴鼠
現在知道在一段時間內,鼴鼠出現的時間和地點,請編寫乙個程式使機械人在這一段時間內打死盡可能多的鼴鼠。首先,座標為 x,y 到座標為 a,b 的網格需要的時間為 x a y b 由於題目已經自動幫我們按時間排好序了,所以,我們可以直接 dp 考慮揹包 include using namespace s...
題解 P2292 HNOI2004 L語言
這到題一眼看去,似乎就是個ac自動機,然後迅速的打出了ac自動機的板子。最開始我想的是,不就判斷一下長度就行了嗎,把每乙個單詞的長度求出來,在ac自動機的時候每次用當前位置的下標減去單詞長度,如果小於等於目前的字首長度,就更新答案,然後迅速地打出 發現只有70分,仔細思考了一下,發現是因為我沒有讀清...