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中尋找...