Prufer序列 性質 證明

2022-01-12 08:01:14 字數 1635 閱讀 6445

下午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 滿足容...