引言
矩陣樹定理是一個基於線性代數工具,解決圖上生成樹計數相關問題的工具。
最大的特點之一就是網上很多人都不會證明。
一些線代基礎:矩陣,行列式等。
為什么要寫這個證明呢?周圍很多人認為比較浪費時間,一般不考。然而輸入感知定理其中的智慧,不僅對於圖論、線性代數有了更深入的了解,還可以為思維注入一些新鮮血液,因此對我個人而言不全是浪費時間之舉。
基礎定義
圖的關聯矩陣
對於一個 \(n\) 個點(第 \(i\) 個點記為 \(v_i\)),\(m\) 條邊(第 \(j\) 條邊記為 \(e_j\))的無向圖(為方便起見我們在此處暫定一個方向),定義其“關聯矩陣” \(M\) 為:
顯然大小是 \(n\times m\) 的。
拉普拉斯(基爾霍夫)矩陣
拉普拉斯矩陣 \(L\) 定義為:
其中 \(\deg v\) 表示頂點 \(v\) 的度數,\(\text{cnt}(u,v)\) 表示邊 \(u\leftrightarrow v\) 的數量。
拉普拉斯矩陣有一個很好的關於關聯矩陣的性質(附證明,\(M^T\) 表示 \(M\) 的轉置):
\(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\) 的矩陣,那么:
證明?式子太 shit 了先咕了,而且又不是重點,感性理解吧。
Matrix Tree 定理
定理內容
記 \(L_0\) 為 \(L\) 去掉某 \(k\) 行及第 \(k\) 列所得的方陣,則該無向圖的生成樹個數為 \(\det L_0\)。
定理證明
根據理論基礎,證明非常簡單:
其中 \(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 定理描述
基於上面的結果,重定義拉普拉斯矩陣:
其中 \(\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\) 的構造如下:
或許你注意到了:\(L=MD^T\)。接下來的步驟大同小異,故 skip。
結語
整個定理結論簡單,證明過程也許繁雜但也非無跡可尋。不論是無向圖還是有向圖,其核心思想是類似的。其中利用行列式值和所求的相對應起來,以及利用 Cauchy-Binet 公式中 \(S\) 的枚舉這些思想都是具有啟發性的。