問題描述:給定n階無向圖求其生成樹個數。
引入:行列式
乙個n*n的矩陣a的行列式det(a)或者|a|定義為: ∑p
∈p(n
)(−1
)f(p
)πni
=1ai
,pi ∑p∈
p(n)
(−1)
f(p)
πi=1
nai,
pi
其中p(n)表示長度為n的排列的集合,f(p)表示排列p的逆序對個數。
行列式具有以下性質:
1. |a|
=|at
| |a|=
|at|
,即a的行列式等於其轉置矩陣的行列式。
2. |ab|=|a||b|。
3. 將a任意兩行交換得到b,則|b|=-|a|。
4. 將a任意一行同時乘上x得到b,則|b|=x|a|。
5. 將a任意一行乘上x再加到另一行上,行列式不變。
考慮一幫情況下如何求行列式,樸素的方法是列舉排列;但是根據上述性質,若能將矩陣消成只有對角線有值的情形,那麼此時行列式的值等於對角線的乘積,這樣紀錄此時和原來的行列式的比值即可。特殊的,如果對角線上有0,那麼行列式=0.
6. 每行每列和=0的矩陣行列式=0.由於高斯消元的時候該性質不變因而最終最後一行前n-1個數字=0,有一位和=0故最後一行全0,行列式=0.
矩陣樹定理:
先討論簡單圖。
定義度數矩陣d滿足d(i,i)=(點i的度數),d(i,j)=0(對於i≠
j i≠j
)。 定義鄰接矩陣a滿足若(i,j)間有連邊則a(i,j)=1,否則a(i,j)=0。
定義霍爾基弗矩陣c=d-a,即c(i,i)=(點i的度數),d(i,j)=-1當且僅當i和j間有連邊(i≠
j i≠j
) 定義乙個矩陣a的余子式m(i,j)表示a去掉第i行第j列後的行列式。
矩陣樹定理:基爾霍夫矩陣c的余子式m(i,i)的行列式(1≤
i≤n 1≤i
≤n
)就是圖g的生成樹數量。
矩陣樹定理 生成樹計數 學習筆記
對於乙個圖g gg,定義其度數矩陣為d g d g d g d g d g d g 是乙個n n n nn n大小的對角線矩陣.對角線上元素d i i d d i,i 為頂點i ii的度數。非對角線上的元素d i j d d i,j 為0 對於乙個圖g gg,定義其臨接矩陣為a g a g a g ...
學習筆記 矩陣樹定理
因為在臨時抱佛腳,所以是沒有證明的 對於行列式 d 任意第 i 行 列同理 按下式展開的值與行列式值相等 text sum n 1 cdot a cdot m 其中 m 是 a 的余子式。一些閒話 這個可以用來推導 輪狀病毒 一題中的遞推式。構造連通矩陣和度數矩陣。連通矩陣 a 的第 i 行第 j ...
BZOJ 1016 最小生成樹計數(矩陣樹定理)
我們把邊從小到大排序,然後依次插入一種權值的邊,然後把每乙個聯通塊合併。然後當一次插入的邊不止一條時做矩陣樹定理就行了。算出有多少種生成樹就行了。剩下的交給乘法原理。實現一不小心就會讓程式變得很醜 include include include include includeusing namesp...