矩陣樹定理學習筆記

2022-06-04 04:00:09 字數 2753 閱讀 4151

本篇部落格僅針對定理的應用、實現進行總結,至於證明「前人之述備矣」,所以這裡就不贅述了。我絕對不會告訴你,是因為博主又笨又懶不會證!

\(kirchhoff\) 矩陣樹定理(簡稱矩陣樹定理)用於解決一張圖的生成樹個數計數問題。

對於⼀個⽆向圖 \(g\) ,它的⽣成樹個數等於其基爾霍夫 \(kirchhoff\) 矩陣任何⼀個 \(n-1\) 階主⼦式的⾏列式的絕對值。

\(★\): 在矩陣樹中,無論有向無向邊都允許重邊,但是不允許自環的存在。

對於任意乙個行列式,我們都可以通過以上性質將其轉化為上三角下三角矩陣。其值就是對角線的乘積。因此,我們要用到高斯消元求值。

高斯消元大家都會吧? 那玩意兒跟我有仇,我是不會講它的!!!

\(kirchhoff\) 矩陣 \(k\) = 度數矩陣 \(d\) - 鄰接矩陣 \(a\);

具體構造:

對於無向圖,我們可以直接寫乙個加邊函式:

inline void add(int x,int y)
而對於有向圖,我們就要分情況而定了。

首先,先確定邊統一的方向,到底是內向樹還是外向樹。

內/外向樹,顧名思義嘛~ 內向樹就是從外向根拓展,方向向內,外向樹就是從根向外拓展,方向向外。感性理解一下啦~

這裡引用command_block巨佬在部落格中的介紹方法,

前面都是無向圖,神奇的是有向圖的情況也是可以做的。

(鄰接矩陣 \(a\) 的意義同有向》 圖鄰接矩陣)

那麼現在的矩陣 \(d\) 就要變一下了。

若 \(d[i][i] = \sum_^n a[j][i]\),即到該點的邊權總和(入)。

此時求的就是外向樹 (從根向外)

若 \(d[i][i] = \sum_^n a[i][j]\),即從從該點出發的邊權總和(出)。

此時求的就是內向樹 (從外向根)

此外,既然是有向的,那麼就需要指定根。

前面提過要任意去掉第 \(k\) 行與第 \(k\) 列,是因為無向圖所以不用在意誰為根。

在有向樹的時候需要理解為指定根,結論是 : 去掉哪一行就是那乙個元素為根。

所以,建邊方式為:

inline void add(int x,int y)
inline void add(int x,int y)

這裡就以無向圖和內向樹舉例:

if(!opt) 

else

}

掌握好建圖技巧,就可以開啟我們的征途啦~ ↖(ω)↗

下面是具體的分類例題講解~

題目鏈結

矩陣樹定理如下(上面提到過):

對於乙個無向圖 \(g\) ,它的生成樹個數等於其基爾霍夫 \(kirchhoff\) 矩陣任何乙個 \(n-1\) 階主子式的行列式的絕對值。

因為要求房子聯通,所以就是要將房子看作點,如果兩個房子相鄰,就連邊。

詳細題解和**點這裡~

題目鏈結

其實我的想法就是直接把病毒看做乙個無向圖,連好邊之後用矩陣樹定理就好了。

具體加邊操作如下:

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

//把中心點記作 n+1, 加的是內邊。

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

//加外邊

add(n,1);

但是這道題要高精,我,我不會懶得打,所以大家學思想就夠了/doge

題目鏈結

題解啥的就先咕了吧,什麼時候有時間了再補~

**實現:

#include#include#includeusing namespace std;

#define ll long long

const int mod = 2007;

int f,sum[405][405];

char c;

inline void read(int &x)

while(c <= '9' && c >= '0') x = x * 10 + c - '0', c = getchar();

x *= f;

} inline int solve(int n)

} ans = (ans * sum[i][i] % mod + mod) % mod;

} return ans;

}int main()

memset(sum,0,sizeof(sum));

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

printf("%d\n",solve(n - 1));

} return 0;

}

\(it\)

\(will\)

\(be\)

\(finished\)

\(sometime\)......

矩陣樹定理學習筆記

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,就不增加 具體怎麼算呢?比如說上圖...

矩陣樹定理學習筆記

對矩陣 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 ...