數學 Matrix Tree定理證明

2022-05-08 07:09:11 字數 2491 閱讀 5974

老久沒更了,冬令營也延期了(延期後豈不是志願者得上學了?)

最近把之前欠了好久的債,諸如fft和matrix-tree等的搞清楚了(啊我承認之前只會用,沒有理解證明……),fft老多人寫,而matrixtree沒人證我就寫一下吧……

matrix tree的結論網上可多,大概一條主要的就是,圖中生成樹的數量等於 \(v-e\) 的任一余子式,其中:

為了求無向圖中有多少組 \(n-1\) 條邊可以形成樹,一般需要列舉所有的可能,無法在多項式內解決,但我們利用數學工具將其轉換——引入關聯矩陣

為了後面討論我們給每條邊隨意分配乙個方向。

圖的鄰接矩陣是乙個 \(n\times n\) 的用於儲存圖的矩陣。而關聯矩陣 \(a\) 則為 \(n\times m\) 的矩陣,其中行對應點,列對應邊,如果 \(a_\) 非零,則說明第 \(j\) 條邊的起點或終點為點 \(i\)(如 \(i\) 為起點則為 \(+1\),終點則為 \(-1\),否則為 \(0\))。如下圖即為一張 \(4\) 點 \(5\) 邊的圖的關聯矩陣:

\[\begin

+1 & -1 & +1 & 0 & 0\\

-1 & 0 & 0 & +1 & -1\\

0 & +1 & 0 & -1 & 0\\

0 & 0 & -1 & 0 & +1

\end

\]可以看到,如果只考慮這張圖的結構的話,關聯矩陣的行之間或列之間隨意交換都是無所謂的(行交換代表點重新編號……)

我們可以證明乙個結論,任意連通圖的關聯矩陣秩為 \(n-1\)。

有兩種理解方式:

再按列來看更為顯然:

這下從行列兩個方向證明了這個結論,但有何用處呢?

我們剛在從列的方向證明結論時用到了「生成樹」的概念,仔細考慮一下,求「圖中有多少種 \(n-1\) 條邊的組合沒有環」,等價於求「關聯矩陣中有多少種 \(n-1\) 列的組合線性無關

同時我們證明了 \(n\) 個行中總有乙個是多餘的,故考慮刪去其中一行對答案無影響。

這下將圖中的問題轉化為了矩陣中的問題,但是否將過程複雜化了呢?

為了解決這個問題,我們需要引入 binet-cauchy公式:

若存在 \(n\times m\) 的矩陣 \(a\) 與 \(m\times n\) 的矩陣 \(b\),則矩陣 \(ab\) 的行列式等於:從 \(m\) 中任意選取 \(n-1\) 個指標,並取出 \(a\) 的這 \(n\) 列得到 \(a'\),和 \(b\) 的這 \(n\) 行的得到 \(b'\),將它們行列式乘起來得到 \(\det a'\times \det b'\),對所有共 \(c_m^n\) 種選取情況求和。

數學表達:

\[\det (ab)=\sum_\det(a_s)\det(b_s)

\](其中 \(u\) 表示集合 \(\\),\(a_s\) 表示取出 \(s\) 中下標的列組成的矩陣,\(b_s\) 表示取出 \(s\) 中下標的行組成的矩陣)

可以發現其中幾種特殊情況:

這個公式的證明過於繁瑣,不予展開,但可以感性理解:\(ab\) 是 \(a\) 的以 \(b\) 為係數的線性組合,將 \(ab\) 的行列式展開後分離貢獻,\(\det (a_s)\) 的係數是 \(\det(b_s)\)

為了解決這個問題引入這個公式,很明顯是和其中的共同擁有的「任意選取」、「線性無關」兩個因素有關。

很容易想到是想要將圖的關聯矩陣 \(d\)(去掉一行後)放入 \(a\) 或 \(b\) 的位置,但具體怎麼放,另乙個矩陣又是什麼?

引理:連通圖的關聯矩陣中,任意乙個子矩陣的行列式都為 \(\pm 1\) 或 \(0\)

證明:

有了這個引理,可以非常自然的考慮將 \(a\) 設為 \(d\),\(b\) 設為 \(d^t\),則 \(a_s\) 和 \(b_s\) 都是取 \(d\) 的不同列向量組成的矩陣。

由於我們證明了,列線性無關的子矩陣行列式一定為 \(\pm 1\),則平方後一定為 \(1\)。再利用上述公式,故原問題的的答案即為 \(\det (ab)\)

至於 \(ab\) 是啥?\(ab=dd^t\)

考慮下關聯矩陣 \(d\) 的定義,即可發現 \((ab)_\):

回顧整個過程:

為了將關聯矩陣放入公式,證明了關聯矩陣中任意乙個子矩陣行列式為 \(\pm 1\) 或 \(0\)

巧妙地將 \(a\) 設為 \(d\),\(b\) 設為 \(d^t\),則得到的結果 \(\det(ab)\)

考慮 \(ab=dd^t\) 的現實意義,得到開頭提到的matrix tree定理

剛才討論的都是無向生成樹,可以考慮到有向生成樹的情況:

考慮外向生成樹關聯矩陣的特點:除了根以外每一行都只有乙個 \(-1\)(樹上只有乙個父親)

而若生成樹不是外向生成樹,則一定存在乙個點 \(x\),關聯矩陣中 \(x\) 對應的那一行沒有 \(-1\)

所以可以考慮將原來每條邊「乙個 \(+1\) 乙個 \(-1\)」中的 \(+1\) 置為零,則在計算時:

模板 Matrix Tree 定理

點此看題 本題就是矩陣樹定理中外向樹的情況。矩陣樹定理原來求的是生成樹的數量,但是這裡要求生成樹邊權乘積之和,觀察行列式的定理,不難發現矩陣構建時換成邊權就行了。有兩個結論 原理作者沒有搞太懂,中考完了再深究吧。include include using namespace std define i...

Matrix Tree定理 初探矩陣樹小結

目前我也只做過一些矩陣樹的模板題,對於這個神奇的演算法了解並不深入,再加上這個演算法的證明需要一定的線性代數的基礎,所以這篇部落格目前只能說是我對於這個定理自己的理解,重點並不在於證明。問題描述 矩陣樹問題直觀地說,就是給出乙個圖,求在這個圖中生成樹的方案數 問題解法 首先將這個圖轉換成乙個矩陣,這...

生成樹計數的MatrixTree定理

在省選級別的題目裡面,我們會發現有一類生成樹計數的題目。就是給定乙個圖g 問這個圖生成樹有多少棵 節點和邊都不同 這裡我們可以用基爾霍夫矩陣做。我們定義乙個圖有度數矩陣 a 有鄰接矩陣 b,其中ai i 表示節點 i 的度數,其餘為0,bi j 1表示有邊 i,j 反之為 0 那麼基爾霍夫矩陣就是c...