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