Matrix Tree 定理及證明


引言

矩陣樹定理是一個基於線性代數工具,解決圖上生成樹計數相關問題的工具。

最大的特點之一就是網上很多人都不會證明。

一些線代基礎:矩陣,行列式等。

為什么要寫這個證明呢?周圍很多人認為比較浪費時間,一般不考。然而輸入感知定理其中的智慧,不僅對於圖論、線性代數有了更深入的了解,還可以為思維注入一些新鮮血液,因此對我個人而言不全是浪費時間之舉。

基礎定義

圖的關聯矩陣

對於一個 \(n\) 個點(第 \(i\) 個點記為 \(v_i\)),\(m\) 條邊(第 \(j\) 條邊記為 \(e_j\))的無向圖(為方便起見我們在此處暫定一個方向),定義其“關聯矩陣” \(M\) 為:

\[M_{i,j} = \begin{cases} 1 & e_j \text{是} v_i \text{的入邊} \\ -1 & e_j \text{是} v_i \text{的出邊} \\ 0 & \textit{otherwise.} \\ \end{cases} \]

顯然大小是 \(n\times m\) 的。

拉普拉斯(基爾霍夫)矩陣

拉普拉斯矩陣 \(L\) 定義為:

\[L_{i,j} = \begin{cases} \deg v_i & i = j\\ -\text{cnt}(v_i, v_j) & i \ne j \end{cases} \]

其中 \(\deg v\) 表示頂點 \(v\) 的度數,\(\text{cnt}(u,v)\) 表示邊 \(u\leftrightarrow v\) 的數量。

拉普拉斯矩陣有一個很好的關於關聯矩陣的性質(附證明,\(M^T\) 表示 \(M\) 的轉置):

\[L = M \times M^T \\ L_{i,i} = \sum_{k=1}^n M_{i,k}M^T_{k,i} = \sum_{k=1}^n M^2_{i,k}=\deg v_i \\ L_{i,j} = \sum_{k=1}^n M_{i,k}M^T_{k,j} = \sum_{k=1}^n M_{i,k}M_{j,k}=-\text{cnt}(v_i, v_j) \]

\(M\)\(M^T\) 相乘的意圖何在?注意這樣直接實現了內積,對於 \(i=j\) 的情況,只要 \(e_k\)\(v_i\) 相連即產生 \(1\) 的貢獻;對於 \(i\ne j\) 的情況,如果 \(e_k=(i,j)\),那么會有 \(-1\) 的貢獻。通過這個性質我們可以實現 \(L\)\(MM^T\)​ 之間的互相轉換。除此之外,更加深層的目的將在下面提到。

理論鋪墊

關聯矩陣與圖性質的關系

考慮我們最終的目的是選擇 \(m\) 條邊中的 \(n-1\) 條,那么相當於在關聯矩陣中“抽出” \(n-1\) 列。這些列編號的集合記為 \(S\),記 \(M[S]\)\(M\) 僅保留列 \(S\) 得到的矩陣,大小為 \(n\times (n-1)\)(為了方便,如果行比列多,可能以此表示保留行而不是列)。

方陣更容易研究,考慮將 \(M[S]\) 的某一行扔掉,是不會丟失信息的;相反扔掉更多的行則會有丟失——這一點還原到原圖上就比較顯然了。這也反映 \(M[S]\) 的秩為 \(n-1\)。設丟掉一行后的矩陣為 \(M_0[S]\),這個“丟掉一行”在原圖上可以理解為忽略生成樹的根,由於是無向圖,根的實際選擇不需要關心,因此說將“某一行扔掉”。

思考對於一個不合法的情況,那么圖中必然有環。於是不難想到環中這些邊對應的列向量必然線性相關。換句話說,不滿秩。不滿秩的一個比較簡潔的充要條件是 \(\det M_0[S] = 0\)

反之如果生成樹合法,那么 \(\det M_0[S]=\pm1\)。這個不難證,首先對於一個葉子,必然有對應行只有一個非零元素。使對應行消去其他行,然后該非零元素對應的行列都只有其一個非零元素。我們拋掉這一行和這一列,剩下部分仍然可以歸納下去。最后每行只剩下恰好一列上為 \(\pm 1\)。那么行列式值也為 \(\pm 1\)

柯西-比內(Cauchy-Binet)定理

\(A\)\(n\times m\) 的矩陣,\(B\)\(m\times n\) 的矩陣,那么:

\[\det (AB)=\sum_{S\subseteq \{1, 2, \cdots, m\}\land |S|=n}(\det A[S])(\det B[S]) \]

證明?式子太 shit 了先咕了,而且又不是重點,感性理解吧。

Matrix Tree 定理

定理內容

\(L_0\)\(L\) 去掉某 \(k\) 行及第 \(k\) 列所得的方陣,則該無向圖的生成樹個數為 \(\det L_0\)

定理證明

根據理論基礎,證明非常簡單:

\[\begin{aligned} \det L_0 &= \det (M_0M_0^T) \\ &= \sum_{S\subseteq \{1, 2, \cdots, m\}\land |S|=n-1}(\det M_0[S])(\det M_0^T[S]) \\ &= \sum_{S\subseteq \{1, 2, \cdots, m\}\land |S|=n-1}(\det M_0[S])^2 \end{aligned} \]

其中 \(S\) 恰好為一個選邊方案,如果合法那么 \(\det^2\) 產生 \(1\) 的貢獻,反之沒有貢獻。

最后顯然就是生成樹的個數。

定理理解

整個定理比較復雜,內容比較多,然而核心是很明確的。

首先是 \(M_0[S]\)​ 的行列式為 \(\pm 1\) 當且僅當生成樹合法。

然后借助 Cauchy-Binet 公式中的枚舉 \(S\) 可以完美表示出“枚舉邊的子集”這一個過程。同時上面 \(\pm 1\) 我們還需要將其轉化為 \(1\),最后 \((\det M_0[S])^2\) 正是我們想要的。

Cauchy-Binet 公式中等式的另一邊 \(\det L_0\) 簡潔且好求,直接根據輸入的圖即可構造。

直接看整個定理像是湊出來的,然而仔細理解證明,再去挖掘整個想法便豁然開朗了。

有向圖上的拓展

一些扯淡

我個人認為,沒有理解 Matrix Tree 定理本質,是不太能講清楚為什么有向圖可以這么簡單地拓展的。其中的精髓其實是拉普拉斯矩陣的定義,如何設計才最合適。

有向圖的 Matrix Tree 定理描述

基於上面的結果,重定義拉普拉斯矩陣:

\[L_{i,j}=\begin{cases} \deg_{\text{in}}v_i & i = j\\ -\text{cnt}(v_i\to v_j) & i\ne j \end{cases} \]

其中 \(\deg_\text{in} u\)​ 表示 \(u\)​ 的入度;\(\text{cnt}(u\to v)\)​ 表示有向邊 \(u\to v\)​ 的個數。

\(\det L_0\) 即為外向生成樹的個數。

看起來……有那么點道理?

有向圖中的定理理解

事實上這里沒有什么 \(L=MM^T\) 了,如果單純去重定義 \(M\) 是找不出這樣一個 \(M\)​ 可以滿足這個性質湊數上面那個 \(L\) 的。

這就需要考慮無向圖中這個 \(M\) 的真實目的。對於合法的 \(S\)\(\det M_0[S]=\pm 1\)\((\det M_0[S])^2=1\),這是關鍵,那么對於有向圖我們也從中入手。

考慮一個外向樹應該有什么性質。在無向圖中我們嘗試從樹最基本的特征如手,這里我們如法炮制:對於外向樹的葉子而言,它只有一個入邊。觀察關聯矩陣,該葉子對應的行一定只有一個 \(1\)​,其他都是 \(0\)

還是消元,我們發現只有一行在這一列有一個 \(-1\)​,即葉子的父親。這樣一直下去,\(M_0\)​ 會被消成一個單位矩陣,顯然 \(\det =1\)​​,注意不同於之前的 \(\pm 1\)​。還有一點,外向樹只是 \(\det =1\) 的充分條件但不必要,這里仍然只保證了構成樹。

由於 Cauchy-Binet 公式是幫助我們間接枚舉邊集用的,實際上不可或缺。我們希望去迎合它,同時在 \(\det M_0[S]=1\) 的基礎上再加一個。考慮新設計一個 \(n\times m\)\(D\) 矩陣,滿足 \(\det D_0[S]=1\)​ 當且僅當​ \(S\) 構成的圖每個點(除了去掉的那一行)都有恰好一條入邊——加上這個限制后恰好滿足了外向樹。

那么 \(D\) 的構造如下:

\[D_{i,j} = \begin{cases} 1 & e_j \text{是} v_i \text{的入邊} \\ 0 & \textit{otherwise.} \\ \end{cases} \]

或許你注意到了:\(L=MD^T\)​。接下來的步驟大同小異,故 skip。

結語

整個定理結論簡單,證明過程也許繁雜但也非無跡可尋。不論是無向圖還是有向圖,其核心思想是類似的。其中利用行列式值和所求的相對應起來,以及利用 Cauchy-Binet 公式中 \(S\)​ 的枚舉這些思想都是具有啟發性的。


免責聲明!

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



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