[学习笔记] Matrix tree定理
前言
為了回歸算法本身,為了搞懂算法,我參考了不同博客,并將他們做出整合和補充:
- https://www.luogu.com.cn/blog/tanrui-2960967961/matrix-tree-ding-li-ji-ji-ying-yong#
- https://blog.csdn.net/a_crazy_czy/article/details/72971868
- https://www.cnblogs.com/zj75211/p/8039443.html
- https://www.cnblogs.com/lishuyu2003/p/12093947.html
本文將分成333個部分:行列式的性質,定理的證明,定理的應用和擴展。標記的即為暫時不懂的地方,會漸漸完善
UPD 2020/9/27:增加了一些證明,修改了一些錯誤之處
行列式的性質
det(A)=∑p(?1)r(p)×A1,p1×......×An,pndet(A)=\sum_{p}(-1)^{r(p)}\times A_{1,p_1}\times ......\times A_{n,p_n}det(A)=∑p?(?1)r(p)×A1,p1??×......×An,pn??
性質1:互換矩陣的兩行(列),行列式變號
可以看如下示例(盜個圖)
對于后面乘積相同的兩項,我們只用考慮前面系數變化的情況,即行列式的變化情況。
此處引出一個結論,對于一個排列,交換其中兩個元素,行列式變化為奇數:
那么后面的乘積不改變,而前面的系數是一定要變號的,所以行列式變號。
性質2:如果有兩行完全相同,行列式為0
交換這兩行,得到的矩陣相同,行列式不變,但由(1)(1)(1)得行列式變號,所以行列式一定為000
性質3 如果矩陣的某一行(列)中的所有元素都乘以同一個數k,新行列式的值等于原行列式的值乘上數k
提公因數即可
類似地,如果矩陣的某一行(列)中的所有元素都有一個公因子k,則可以把這個公因子k提到行列式求和式的外面。
性質4 如果矩陣有兩行(列)成比例(比例系數k),則行列式的值為 0
先把這個比例系數提出去,然后可以運用性質2
性質5 如果把矩陣的某一行(列)加上另一行(列)的k倍,則行列式的值不變
考慮行列式的計算,我們把它拆成兩部分,分別是原來的部分和新加的部分(因為每一行只會選一個,看做特殊的分配率),新加的部分一定滿足性質4,加上的部分行列式為000,所以行列式不變。
優化行列式求法
綜上,我們可以把矩陣消成上三角矩陣,求對角線乘積即為行列式的值,時間復雜度O(n3)O(n^3)O(n3)
標記1:如果要求的矩陣不允許出現實數,且需要取模,可以看看給出的博客,我不會。
Matrix Tree定理的證明
內容
Kirchhoff\text{Kirchhoff}Kirchhoff 矩陣是指的對于一個圖構造出來的一個矩陣,具體定義為度數矩陣減去鄰接矩陣,度數矩陣指:
Ai,j={degii=j0otherwiseA_{i,j}=\begin{cases}deg_i&i=j\\0&otherwise\\\end{cases}Ai,j?={degi?0?i=jotherwise?定理:一個圖中的生成樹個數等于其 Kirchhoff\text {Kirchhoff}Kirchhoff 矩陣的任意一個代數余子式的行列式。
性質1
一個圖的 Kirchhoff\text{Kirchhoff}Kirchhoff 矩陣行列式為零。
可以考慮高斯消元的過程,一開始每一行的和為000,而消元過程中每一行的和保持是000,最后我們要消成上三角矩陣,最后一行只有最邊上元素可能有值,而行和為000,這個值也是000,所以行列式為000
性質2
一個圖的 Kirchhoff\text{Kirchhoff}Kirchhoff 矩陣的任一代數余子式的行列式相同。
標記2:yysy,這個性質我證不來
2020/9/27更新:這個結論好像并不需要證明,證明出矩陣樹定理之后可以反推這個結論。
前置定義
我們定義一個圖的關聯矩陣BBB為:對于第kkk條邊(u,v)(u,v)(u,v),Bk,u=1,Bk,v=?1B_{k,u}=1,B_{k,v}=-1Bk,u?=1,Bk,v?=?1
一個矩陣的轉置矩陣為:Ai,jT=Aj,iA_{i,j}^T=A_{j,i}Ai,jT?=Aj,i?
有一個性質,設這個圖的 Kirchhoff\text{Kirchhoff}Kirchhoff 為LLL:
L=BBTL=BB^TL=BBT
標記3:yysy,這個性質我證不來
2020/9/27更新:其實這個證明還是比較容易的,就用矩陣乘法的定義,這次乘法bu,ib_{u,i}bu,i?和bi,v′b'_{i,v}bi,v′?會對au,va_{u,v}au,v?產生?1-1?1的貢獻,會對bu,i,bi,u′b_{u,i},b'_{i,u}bu,i?,bi,u′?會對au,ua_{u,u}au,u?產生111的貢獻,就變成了原圖的矩陣。
Part 1
對于一個非聯通圖GGG,∣L∣=0|L|=0∣L∣=0
設 MiM_iMi? 為 LLL 刪去第iii行第iii列后得到的矩陣,設 GiG_iGi? 為第iii個強聯通分量,我們把同一個強聯通分量的結點通過交換行換到一起(雖然會變號,但如果行列式為000就沒關系),Kirchhoff\text{Kirchhoff}Kirchhoff 矩陣變為這樣:
G10......00G2......0..............000Gk\begin{matrix}G_1&0&......&0\\0&G_2&......&0\\...&...&......&..\\0&0&0&G_k\end{matrix}G1?0...0?0G2?...0?..................0?00..Gk??其中∣Gi∣=0|G_i|=0∣Gi?∣=0(Kirchhoff\text{Kirchhoff}Kirchhoff 矩陣的性質111),我們可以看出:
∣L∣=∣G1∣×.....×∣Gk∣|L|=|G_1|\times .....\times |G_k|∣L∣=∣G1?∣×.....×∣Gk?∣所以∣L∣=0|L|=0∣L∣=0,也不難推知∣Mi∣=0|M_i|=0∣Mi?∣=0
Part 2
對于一棵樹GGG,∣Mi∣=1|M_i|=1∣Mi?∣=1
標記4:yysy,我不會證
2020/9/27更新:補充這個結論的證明,主要是運用巧妙的消元。
首先我們定根為111,把其他點按照到111的距離排序,我們按這個順序對點重新編號,這樣構成的矩陣是按深度排了序且和原來的矩陣等效(因為每一對交換都要換行和換列,行列式不變號),我們先把根所在的一行一列刪去,然后看圖:
我們先從右下角的位置考慮,他的值一定是111(是葉子),進行上述操作之后往上訪問的時候又可以得到一個值為111的點(都被他的兒子消掉了),整個過程之后會變成一個對角線全為111的上三角矩陣,所以行列式為111
Part 3
標記5:yysy,這個定理不會證明
UPD 2021/2/6:居然有巨佬硬剛這個定理,有時間我去康康
首先要知道Binet-Cauthy\text{Binet-Cauthy}Binet-Cauthy定理,內容大致如下:
∣AB∣=∑∣S∣=n∣Ap∣×∣Bp∣|AB|=\sum_{|S|=n}|A_p|\times |B_p|∣AB∣=∣S∣=n∑?∣Ap?∣×∣Bp?∣其中A是一個m×nm×nm×n的矩陣,B是一個n×mn×mn×m的矩陣,ApA_pAp?是把AAA的一些行刪去(剩下的行集合為SSS)使之成為n×nn\times nn×n的矩陣,BpB_pBp?類似地刪去它的列。
套用這個定理,我們可以推倒:
∣Mi∣=∣Bi∣×∣BiT∣=∑∣S∣=n?1∣Bi,p∣×∣Bi,pT∣|M_i|=|B_{i}|\times|B_{i}^T|=\sum_{|S|=n-1}|B_{i,p}|\times |B_{i,p}^T|∣Mi?∣=∣Bi?∣×∣BiT?∣=∣S∣=n?1∑?∣Bi,p?∣×∣Bi,pT?∣結合part?1\text{part 1}part?1和part?2\text{part 2}part?2,我們可以知道當是一棵樹的時候會產生111的貢獻,其余情況為000,所以∣Mi∣|M_i|∣Mi?∣即為生成樹個數。
應用及擴展
板題
點此看題
我因為輸出格式卡了很久,我好像是sb(自信點,把好像去掉)
板題2
點此看題解(一站式服務)
矩陣樹定理的擴展
這是對于更寬泛的問題,做做這道題吧
有向擴展
什么?矩陣樹還能有向擴展?
比較基礎的是這道題
綜合應用
點此看題
總結
以上是生活随笔為你收集整理的[学习笔记] Matrix tree定理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自然语言处理笔记9-哈工大 关毅
- 下一篇: 智能化整体图例,布线、安防、广播会议、电