【hnoi2004】樹的計數
這道題資料水的一匹我無話可說,謎之錯誤(陣列賦值的時候乙個下標寫錯了變數)居然只wa了一組。
寫這道題關鍵需要知道prufer序列以及cayley定理。
prufer數列,可以用來解一些關於無根樹計數的問題。
prufer數列是一種無根樹的編碼表示,對於一棵n個節點帶編號的無根樹,對應唯一一串長度為n-1的prufer編碼。
(1)無根樹轉化為prufer序列。
首先定義無根樹中度數為1的節點是葉子節點。
找到編號最小的葉子並刪除,序列中新增與之相連的節點編號,重複執行直到只剩下2個節點。
如下圖的樹對應的prufer序列就是3,5,1,3。
具體實現可以用乙個set搞定,維護度數為1的節點。複雜度o(nlogn)。一棵n個節點的無根樹唯一地對應了乙個長度為n-2的數列,數列中的每個數都在1到n的範圍內。(2)prufer序列轉化為無根樹。
設點集v=,每次取出prufer序列中最前面的元素u,在v中找到編號最小的沒有在prufer序列**現的元素v,給u,v連邊然後分別刪除,最後在v中剩下兩個節點,給它們連邊。最終得到的就是無根樹。
具體實現也可以用乙個set,維護prufer序列中沒有出現的編號。複雜度o(nlogn)。
最後有乙個很重要的性質就是prufer序列中某個編號出現的次數就等於這個編號的節點在無根樹中的度數-1。
上面這句話比較重要。通過上面的定理,
1)我們可以直接推出n個點的無向完全圖的生成樹的計數:n^(n-2) 即n個點的有標號無根樹的計數。
2)乙個有趣的推廣是,n個節點的度依次為d1, d2, …, dn的無根樹共有 (n-2)! / [ (d1-1)!(d2-1)!..(dn-1)! ] 個,因為此時prüfer編碼中的數字i恰好出現di-1次。
即 n種元素,共n-2個,其中第i種元素有di-1個,求排列數。
3)n個節點的度依次為d1, d2, …, dn,令有m個節點度數未知,求有多少種生成樹?(bzoj1005 明明的煩惱)
令每個已知度數的節點的度數為di,有n個節點,m個節點未知度數,left=(n-2)-(d1-1)-(d2-1)-...-(dk-1)
已知度數的節點可能的組合方式如下
(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left!
剩餘left個位置由未知度數的節點隨意填補,方案數為m^left
於是最後有
ans=(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left! * m^left
#include#include#include
#include
#define ll long long
using
namespace
std;
int n,tot,sum1[160],sum2[160
];ll ans;
intmain()
else
}for(int i=1;i<=n;++i)
x--;tot+=x;
for(int j=1;j<=x;++j) sum2[j]++;
}if(tot!=n-2
)
for(int i=1;ii)
if(j%i==0&&sum1[j]>0
) }
if(!flag) break
; }
}ll a=1,b=1
;
for(int i=1;i<=n-2;++i)
for(int i=1;i<=n-2;++i)
printf(
"%lld\n
",a/b);
return0;
}
2019-01-18 17:24
kgxpbqbyt 閱讀(
...)
編輯收藏
HNOI2004 樹的計數
傳送門 prufer 序列入門題。首先特判掉 n 1 的情況 度數為 0 則有唯一解,否則無解。然後特判掉總度數不為 2 n 1 的情況 無解。再特判一下出現度數為 0 的點,也就是樹不連通的情況。特判掉這些之後,就可以直接套公式了。ans frac n d i 1 如果不想用組合數來簡化式子的話就...
HNOI 2004 樹的計數 題解
題目傳送門 題目大意 有一棵由 n nn 個點組成的樹,其中 d i d i d i 表示第 i ii 個點的度為 d i d i d i 問有多少棵滿足要求的樹。c ay le ycayley cayley 公式的一種應用。如果不會請點這裡 套乙個高精度板子即可,但是還要判無解的情況。直接上 in...
Hnoi2004 金屬包裹
傳送門 三維凸包模板題 只是聽了聽計算幾何的課之後心血來潮想寫的 我的做法很無腦是吧 暴力列舉三個點組成的三角形,然後列舉剩下的點,判斷其餘點是否都在這個三角形的同一側,是的話則說明這個三角形是凸包的乙個面。理論複雜度應該是 o n 4 不過看上去跑得飛快?人帥自帶小常數哈哈 這個故事告訴我們 大力...