生成樹計數算法


生成樹計數問題:給出一個無向圖,求它的生成樹的個數。

 

預備知識

(1)一個n個頂點的無向圖G,定義它的度數矩陣D,D是一個n*n的矩陣。對於頂點u,設度數為deg[u],如果i=j,那么D[i][j]=deg[i],否則D[i][j]=0.

(2)一個n個頂點的無向圖G,定義它的鄰接矩陣A,A是一個n*n的矩陣。如果i和j之間有邊,那么A[i][j]=1,否則等於0。

(3)一個n個頂點m條邊的無向圖G,定義它的關聯矩陣B,B是一個n*m的矩陣。對於第i條邊e[i]=(u,v),那么B[u][i]和B[v][i]中一個是1,一個是-1,第i列其他值為0。那么我們有

所以對於

如果i=j,它是頂點i的度數,否則,如果i和j之間有邊,那么它等於-1,否則它等於0.

(4)對於一個n個頂點m條邊的無向圖G,定義它的Kirchhoff矩陣C,C是一個n*n的矩陣,

很顯然,C=D-A

 

Matrix-Tree定理

對於一個無向圖G,它的生成樹個數等於其Kirchhoff矩陣任何一個n-1階主子式的行列式的絕對值。 所謂n-1階主子式,就是對於任意一個r,將C的第r行和第r列同表示時刪去后的新矩陣,用下面的字母表示$C_{r}$

接下來,我們首先證明下面四個性質:

性質1:對於任何一個圖的Kirchhoff矩陣C,它的行列式為0。

性質2:對於不連通的圖,它的Kirchhoff矩陣C的任一個n-1階主子式的行列式均為0。

性質3:如果G是一棵樹,它的Kirchhoff矩陣C的任一個n-1階主子式的行列式均為1。

性質4:柯西-比內公式。設A和B分別是n*m和m*n的矩陣,那么

其中S是一個子集,大小為n,也就是S取遍所有的n子集,相應的As和Bs為從A和B中取出S元素下標的所有列和所有行。

性質1證明:由C的性質可得,它的每一行每一列和均為0,那么我們把第2到第n行都加到第一行,那么第一行就全部是0了。有一行全部是0,那么它的行列式就是0了。

性質2證明: 假設G中存在k(k>1)個連通分量G1,G2,,,,,Gk,那么,我們可以重新安排C的行和列使得屬於G1的頂點首先出現,然后是G2等。顯然,行和列都要交換,所以進行了偶數次交換。所以,行列式的符號沒有改變。 交換后是下面這個樣子:

設r是Gi中的第j行,那么

性質3證明:這里給出一個構造的方法,使得矩陣$C_{r}$通過一系列變換,成為上三角矩陣,且對角線全部是1。第一步,將r看做樹根,將所有點按照距離頂點r的距離升序排序,距離相同的隨便排。第二步,重新編號 n-1個頂點,距離r越近的點編號越小,Cr這個矩陣也按照重新編號后的順序重新排列。第三步,對於以r為根的樹,設j是i的父親(父親是r的就不用管了),那么將第i列加到第j列上。 最后我們來說明,現在的Cr是對角線為1的上三角矩陣,也就是說明對於每一列x,第x個元素下面都是0,第x個元素是1。首先最后一列即n-1列滿足,因為它下面沒有元素了。我們來看第x列,它的孩子所在的列都在它的后面。它的孩子,不妨設有三個a,b,c,滿足了第a列第a個元素下面都是0,第a個元素是1,第b列第b個元素下面都是0,第b個元素是1,第c列第c個元素下面都是0,第c個元素是1 。而第x列第x個元素下面的第a,b,c正好都是-1,a,b,c列加過來之后變成0了,而第x個元素原來是4(除了三個孩子外,它還有父親),而第a,b,c列的第x個元素都是-1,加過來之后就是4-3=1了。證畢。

 

性質4:我不會證明這個。

 

有了上面四條性質,來證明Matrix-tree定理:

我們看到,S枚舉了所有的n-1子集,那么對於

如果S枚舉的n-1子集是一個生成樹,它的值為1,否則它為0。所以$det(C_{r})$就是生成樹的個數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM