矩陣樹定理學習筆記

2021-08-20 11:10:41 字數 2964 閱讀 9316

pn)其中p為1−n的任意乙個排列,τ(p)表示排列p逆序對數

形象的表示就是

在這個n=3的矩陣中,每一條線就代表著d1

,p1×

d2,p

2×d3

,p3×

...×

dn,p

n d1,

p1×d

2,p2

×d3,

p3×.

..×d

n,pn

其中可以發現,相連的斜線為/就會讓逆序對數+1,\就不增加

具體怎麼算呢?

比如說上圖中的淡藍色吧,ta的排列是3 1 2,逆序對應該是2

看斜線的話

一開始是/,t++,t=1,ans+=t,ans=1

然後\,t不變,t=1,ans+=t,ans=2

要是向上面一樣模擬的話。。。狀態就有n!個,還需要乙個個算的話想想就害怕

如果要快速計算行列式,我們需要知道行列式的性質

性質一:

乙個矩陣行列互換(a』[i][j]=a[j][i])得到矩陣a』,det(a)=det(a』)

這個似乎顯然咯

性質二:

互換行列式兩行或兩列的位置,det(a』)=-det(a)

那麼我們有乙個很好的推論:若矩陣第i行與第j行的值完全相同,det=0,因為交換這兩行(列)得到的矩陣和以前一樣,而det為相反數,則det=0

性質三:

矩陣a中某一行的元素全部乘以常數k,則det(a』)=k*det(a)

根據行列式的定義式,可以發現,每一行肯定會在每乙個狀態裡出現乙個屬於這一行的數字,因為這一行每乙個數字都擴大了k倍,可以給每乙個狀態帶來k倍的貢獻,得證

性質四:

若存在1<=i,j<=n,k為實數滿足a[i][l]=k*a[j][l]對於所有1<=l<=n均成立,則det(a)=0

根據2、3性質可以得到,可以把常數k提出來,然後兩行相等的話det=0,所以0*k=0

性質五:

將第i行所有元素加上任意其他行元素的實數倍,det(a)不變

證明: 考慮排列p1,p2,p3…..pn對於答案的貢獻

原始矩陣:s1=sign*a[1][p1]* a[2][p2]*….*a[n][pn]

新矩陣: s2=sign*a[1][p1]* a[2][p2]… a[n][pn]+sign*k * a[1][p1]* a[2][p2].. a[j][pi]*..a[n][pn]

而△=sigma(s2-s1)=0,因為△=後面加的一串,看看性質四可以發現後面的=0,所以得證

怎麼快速求行列式的值呢?這裡給出結論

對於第i行,我們希望將滿足i+1<=j<=n的a[j][i]的值變為0,也就是用高斯消元的方法消成乙個上三角,然後把a[i][i]這一部分的值乘起來就好了。

為什麼呢?因為求這個變化後的矩陣和原來的矩陣行列式一樣,也就是轉化為求這個矩陣的行列式,可以發現除了排列pi

=ip i=

i之外,別的排列給出的貢獻都是0,所以把a[i][i]乘起來就好了

注意每次交換兩行的時候要記錄次數,如果是奇數,答案還要乘上-1

這樣就可以o(n^3)實現矩陣行列式的求解。

求乙個圖的生成樹個數,首先構造度數矩陣d和鄰接矩陣a

基爾霍夫矩陣k=d−a

我們去掉k矩陣的第n行和第n列,然後用高斯消元(取模情況下要使用輾轉相除的高斯消元)得到新矩陣的上三角形

對角線乘積的絕對值(a[i][i])就是生成樹個數

這裡獻上裸題:spoj high

#include 

#include

#include

#include

#define ll long long

using

namespace

std;

const

double eps=1e-9;

const

int n=20;

int n;double a[n][n],ans;

void gauss()

for (int j=i;j<=n;j++) swap(a[num][j],a[i][j]);

opt^=1;

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

}for (int i=1;i<=n;i++) ans*=a[i][i];

if (opt==1) ans*=-1;

}int main()

n--;gauss();

printf("%.0lf\n",ans);}}

參考blog:dalaoa,dalao

矩陣樹定理學習筆記

對矩陣 a begina a a dots a a a a cdots a vdots vdots vdots ddots vdots a a a dots a a a a dots a end 它的行列式定義為 det a sum 1 ra a cdots a 其中 p 是 1 sim n 的排列...

矩陣樹定理學習筆記

這也是乙個黑科技 設乙個無向圖的鄰接矩陣為 a 度數矩陣為 d 則基爾霍夫矩陣 k d a 的行列式的值就是生成樹的個數。注意這裡的 k 是要把最後一行和最後一列去掉的。證明?不存在的 它還有乙個擴充套件,叫做變元矩陣樹定理 若將鄰接矩陣的 a i j 設為邊權,度數矩陣的 d i i 設為與 i ...

矩陣樹定理學習筆記

本篇部落格僅針對定理的應用 實現進行總結,至於證明 前人之述備矣 所以這裡就不贅述了。我絕對不會告訴你,是因為博主又笨又懶不會證!kirchhoff 矩陣樹定理 簡稱矩陣樹定理 用於解決一張圖的生成樹個數計數問題。對於 個 向圖 g 它的 成樹個數等於其基爾霍夫 kirchhoff 矩陣任何 個 n...