下午hhy還有aak看到了這個
質問我prufer序列是啥
被迫複習一波
直接從題目看吧
[hnoi2004]樹的計數
大概意思就是給你n個節點
告訴你每個節點的度數
然後問你根據這些度數能夠生成多少棵樹
看樣例
畫個**釋一下4
2 1 2 1
題目中給出的樣例只有這兩種情況,所以輸出答案為2
我們更關心答案怎麼來的,下面來講一下\(prufer\)序列
prufer轉無根樹
舉個栗子
看上面的第乙個圖
圖轉\(prufer\)序列
先找到2,刪除2和2->1連邊,將1入列,刪除1和1->3連邊,3入列,序列就是「1,3」
\(prufer\)序列轉圖
取出m中的1和g中的2連邊,分別刪除兩個集合中的元素
取出m中的3和g中的1連邊,然後……同上……
此時,m空了,g中只剩下了3,4,連線3,4就行了
\(prufer\)序列是一種對有標號無根樹的編碼,長度為節點數-2
看證明一當中轉換的要求
直至樹上只剩下兩個點
可以看到最後有兩個點直接忽略
因為此時再判斷順序沒有意義
那就是總數-2
對於給定的n個點度數,可以構造的樹的數量為
$ (n-2)!/((d1-1)!×(d2-1)!×…×(dn-1)!) $
需要一丟丟前置知識
\[(n-2)!/((d1-1)!×(d2-1)!×…×(dn-1)!)
\]對於這個題目,需要判斷幾個地方
當轉換prufer序列的時候,如果入列次數!=n-2,就一定有問題,輸出0
還有,如果有的節點度數為0,那圖就不聯通,那就輸出0
然後對於個數的求解
組合數打個表就可以了
#include #include #include #include using namespace std;
const int maxn=155;
int c[maxn][maxn];
int ans,d[maxn];
int sum;
int n;
inline void pre()
}int main(){
cin>>n;
if(n==1){
cin>>d[1];
if(d[1]==0) cout<<1<>d[i];
if(!d[i]) return cout<<0沒啥特別難得地方
就是性質三不太好理解
需要多找幾個例子
講真從去年到現在用的並不多
看過就當做是乙個小知識拓展就好
蟹蟹~
線性基性質證明和應用
設當前要插入的數是 x 線性基集合用 a i 表示,則構造方法 模版題 插入 inline void insert long long x 可異或可不異或,a j,j i 不能異或 那麼一共能得出 2 i 個數 不過,這是 a 0 到 a 都有數的情況,實際上應該是 2 m m 表示 a 0 到 a...
傅利葉變換性質證明卷積 傅利葉變換的性質及基本應用
根據前文 rnderace 傅利葉變換,已經對傅利葉變換有了初步認識,這一次我們 一下傅利葉變換的性質以及一些基本的應用。傅利葉變換具有如下形式 這裡我之所以不使用 的記號,就是因為傅利葉變換的兩個條件 1.原函式定義在 上2.原函式要 絕對可積 為有限值,且 對於條件1,如果是以 作為記號,考慮其...
揹包問題貪心選擇性質證明
對於揹包問題可以用貪心演算法求解,作為01揹包的上界函式 下面證明揹包問題滿足貪心選擇性質 設有一按照單位價值排序好的最優解t tk,tn 第乙個裝入的物品是tk 若k 1則存在貪心性質出發的最優解 若k不等於1 如果物品k比物品1重,將k物品中物品1重量的部分卸下,換成物品1,構造新的解t 滿足容...