prufer編碼與Cayley公式

2021-09-03 03:36:59 字數 1401 閱讀 8517

prufer編碼 與 bzoj1430小猴打架

將樹轉化成prufer數列的方法:

一種生成prufer序列的方法是迭代刪點,直到原圖僅剩兩個點。對於一棵頂點已經

經過編號的樹t,頂點的編號為,在第i步時,移去所有葉子節點(度為1

的頂點)中標號最小的頂點和相連的邊,並把與它相鄰的點的編號加入prufer序列

中,重複以上步驟直到原圖僅剩2個頂點。

例子: 以下邊的樹為例子,首先在所有葉子節點中編號最小的點是2,和它相鄰的點的編號是3,

將3加入序列並刪除編號為2的點。接下來刪除的點是4,5被加入序列,然後刪除5,1被加入序列,

1被刪除,3被加入序列,此時原圖僅剩兩個點(即3和6),prufer序列構建完成,為

將prufer數列轉化成樹的方法:

設為一棵有n個節點的樹的prufer序列,另建乙個集合g含有元素,

找出集合中最小的未在prufer序列中出現過的數,將該點與prufer序列中首項連一條

邊,並將該點和prufer序列首項刪除,重複操作n-2次,將集合中剩餘的兩個點之間連

邊即可。

例子:仍為上面的樹,prufer序列為,開始時g=,未出現的編號最小的

點是2,將2和3連邊,並刪去prufer序列首項和g中的2。接下來連的邊為,,

,此時集合g中僅剩3和6,在3和6之間連邊,原樹恢復。

cayley公式:乙個完全圖k_n有n^(n-2)棵生成樹,即n個節點帶標號的無根樹有n^(n-2)個。

題意:一開始森林裡面有n只互不相識的小猴子,它們經常打架,但打架的雙方都必須不是好朋友。

每次打完架後,打架的雙方以及它們的好朋友就會互相認識,成為好朋友。經過n-1次打架之後,

整個森林的小猴都會成為好朋友。 現在的問題是,總共有多少種不同的打架過程。

比如當n=3時,就有六種打架過程。

方案數mod 9999991。

sample input sample output

4 96

n-1次打架之後形成連通圖,實際上可以看做將n-1條邊接入圖中使其形成樹,可

以將樹化為唯一對應的prufer編碼,那麼,樹的個數實際就是prufer編碼的的數目。

由上文中轉化prufer編碼的方式可知,對於一棵n節點樹來說,其prufer編碼有n-2位,

而生成樹的個數就是prufer的個數。那麼,就是n^(n-2)個,而加邊順序有(n-1)!種,

根據乘法原理,則共有(n-1)!*(n^(n-2))個,這即為答案。

#include#define mod 9999991

using namespace std;

typedef long long ll;

int n;ll tmp=1,txp=1;

int main()

Pr fer編碼與Cayley公式

cayley公式是說,乙個完全圖k n有n n 2 棵生成樹,換句話說n個節點的帶標號的無根樹有n n 2 個。今天我學到了cayley公式的乙個非常簡單的證明,證明依賴於pr fer編碼,它是對帶標號無根樹的一種編碼方式。給定一棵帶標號的無根樹,找出編號最小的葉子節點,寫下與它相鄰的節點的編號,然...

Pr fer編碼與Cayley公式

之前做題碰到了乙個用到完全圖的生成樹數量的裸題,上課的時候我知道老師講到有n個節點的完全圖的生成樹的數量是n n 2 這個公式用歸納法應該是可以證明的,自己去網上搜尋了一下,發現還有另外的證法,是用到了pr fer編碼,並且上述提到的公式原來是叫cayley公式。下面簡要談一下自己對這個證法的理解。...

Pr fer編碼與Cayley公式

今天遇到乙個問題 在乙個n階完全圖的所有生成樹的數量為n的n 2次方,想了好久也沒有想出來,還是在網上找到的。簡單點說就是 一一對應法 假定t是其中一棵樹,樹葉中有標號最小者,設為a1,a1的鄰接點為b1,從圖中消去a1點 和邊 a1,b1 b1點便成為消去後餘下的樹t1的頂點.在餘下的樹t1中尋找...