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