Matrix Tree定理 初探矩陣樹小結

2021-08-08 12:03:09 字數 2545 閱讀 9268

目前我也只做過一些矩陣樹的模板題,對於這個神奇的演算法了解並不深入,再加上這個演算法的證明需要一定的線性代數的基礎,所以這篇部落格目前只能說是我對於這個定理自己的理解,重點並不在於證明。

問題描述

矩陣樹問題直觀地說,就是給出乙個圖,求在這個圖中生成樹的方案數

問題解法

首先將這個圖轉換成乙個矩陣,這個矩陣每乙個點(i

,j)

用-1表示是否有一條邊從i到

j 相連, 如果i

=j,這個位置就表示i點的度數

根據matrix-tree定理就可以得到:

這個圖的生成樹之和,就是這個矩陣刪去任意一行和一列,在剩下的矩陣中的行列式的絕對值。(其實個人認為如果不是dalao看到這裡就足夠了,反正考場上也不會要你證明)

證明過程相當複雜,再加上我身為中年選手並沒有太多時間和精力寫這類證明(我看別人的都要看半天,現在乙個小時不到就要肝出來明顯不現實),因此證明只有主幹部分,很多細節並未涉及。

首先我們定義一下幾個矩陣

設c矩陣表示我們剛才所說的矩陣

設b矩陣表示乙個鄰接矩陣,即如有邊

x 表示(u

,v),那麼bu

x=−1

,若為有

向圖,則

bvx=

1,無向

圖bvx

=−1

不難發現 c=

bbt,

bt表示

b矩陣行

列互換後

的矩陣

設br為

b矩陣刪

去r行後

的矩陣

設bfr

表示將b

r中不屬

於邊集f

的邊刪去

後的矩陣

經過大約1頁紙的證明我們可以得到:

如果f中存在環,那麼da

t(bf

r)=0

再經過大約2頁紙的證明還可以得到:(e表示邊集) da

t(cr

)=de

t(br

btr)

=∑f∈

e,|f

|=n−

1det

(bfr

bftr

)=∑f

∈e,|

f|=n

−1de

t2(b

fr)

因為如果f中有環,那麼值一定為0,對答案沒有貢獻,所以這樣可以看做將每一種樹都統計了。

接下來就是求行列式

通過行列式的性質:

1.交換任意兩行,行列式變號。

2.把任意一行乘上乙個常數加在另一行上,行列式結果不變

這樣我們就可以用高斯消元,求出上三角形,這樣一來整個矩陣對行列式有貢獻的就只剩下主對角線上的值。將主對角線上的值乘起來就是我們要的行列式。

以下是模板題bzoj4031的題解

題目描述:

你突然有了乙個大房子,房子裡面有一些房間。事實上,你的房子可以看做是乙個包含n*m個格仔的格狀矩形,每個格仔是乙個房間或者是乙個柱子。在一開始的時候,相鄰的格仔之間都有牆隔著。

你想要打通一些相鄰房間的牆,使得所有房間能夠互相到達。在此過程中,你不能把房子給打穿,或者打通柱子(以及柱子旁邊的牆)。同時,你不希望在房子中有小偷的時候會很難抓,所以你希望任意兩個房間之間都只有一條通路。現在,你希望統計一共有多少種可行的方案。

分析:首先對於每乙個房間,向周圍四個是房間的點連一條邊,求最後的生成樹的個數即可。(其實就是板)

#include

#include

#include

#include

#define sf scanf

#define pf printf

using namespace std;

void read(int &x)

#define maxn 200

long

long d[maxn][maxn],mod;

int w[8][4]=,,,},num[maxn][maxn];

void swa(int x,int y,int n,int &flag)

long

long guess(int n,int m)}}

if(r!=m+1)

return

0; long

long res=1;

for(int i=2;i<=n;i++)

if(flag==1)

res=-res;

return (res+mod)%mod;

}int n,m,k;

char s[maxn][maxn];

int main()

for(int i=1;i<=n;i++)

for(int j=0;jif(s[i][j]=='.')

}/*for(int i=1;i<=cnt;i++)*/

long

long

sum=guess(cnt,cnt);

pf("%lld\n",sum);

}

模板 Matrix Tree 定理

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

數學 Matrix Tree定理證明

老久沒更了,冬令營也延期了 延期後豈不是志願者得上學了?最近把之前欠了好久的債,諸如fft和matrix tree等的搞清楚了 啊我承認之前只會用,沒有理解證明 fft老多人寫,而matrixtree沒人證我就寫一下吧 matrix tree的結論網上可多,大概一條主要的就是,圖中生成樹的數量等於 ...

生成樹計數的MatrixTree定理

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