Matrix-Tree定理及其拓展
正題
不能再半途而廢了。
讓我們現在開始講一下Matirx-Tree定理。
其實這個定理是用來解決關於“用圖建樹的方案樹”之類的問題的。
首先我們要了解幾個定理及其證明。
1.我們定義一個n*n的矩陣A,它的行列式為
p是1到n的一個排列,laowang(p)指的是其中的逆序對個數。其實就是排列一個p使得後面行列不相交
2.那我們根據定義式,就可以知道,任意交換兩行i,j,行列式就會乘上-1.
因為交換i,j兩行的時候,其他的行都是不變的,我們把這單獨兩行提出來,就會發現逆序對的改變都會恰好
3.接著,我們還要推導一個東西,當有兩行一樣時,行列式為0.
比如說這兩行是i,j,首先不討論這兩行,也就是說把這兩行先提出來,我們就會發現,當時,我們可以知道,行列式的符號是不用改變的,因為不存在逆序對,也就是說行列式是,而當的時候,行列式的符號改變了,所以行列式是,又因為i,j兩行完全相同,所以說,加/減的東西也相同。
4.下一個,當一行的數全部乘上了一個k,行列式也乘上k。
顯然的,你直接把中間某一項乘k,再把k提出來即可。
5.當某一行是另一行的k倍,行列式為0.(k!=0)
比如說我們當前的行列式是det,把一行乘k,行列式為k*det,又因為現在兩行都相同,所以k*det=0,又因為k!=0 ,所以det必為0.
6.當某一行加上另一行的k倍時,行列式不變。
因為行列式具有簡單的"分配律",你給第i行都加上第j行的k倍(逐位加),就相當於,把整個矩陣的複製一遍,把其中第i行挖空,再填入第j行的k,然後把兩個矩陣的行列式相加,這樣很明顯是可以成立的,因為相當於你把第i行拆開來罷了。
我們就可以用第6條定理完成求解行列式。
怎麼求呢。。。
首先我們要有一個構造的n*n的矩陣。
像上面這個圖,空出的位置都是0,現在我們如何利用第6條定理,把他轉化為下圖呢?
黃色表示有數,0表示這個數字為0,很多人想問為什麼要化成這個樣子,因為這時,行列式就是對角線的乘積,即為
所以我們試著去構造這樣一個矩陣
for(int j=1;j<=n;j++){
for(int i=j+1;i<=n;i++)
while(d[i][j]){
long long temp=d[j][j]/d[i][j];
for(int k=j;k<=n;k++)
d[j][k]=(d[j][k]-d[i][k]*temp%Mod+Mod)%Mod,swap(d[j][k],d[i][k]);
ans*=-1;
}
ans*=d[j][j];
ans%=Mod;
}
我們試著輾轉相除來解決這個問題,因為一行可以加上或減去另一行的k倍,所以我們聯想到了輾轉相除。我們不斷地拿第j行第j列中的元素出來,讓它與下面的元素比較,直到把他下面的全部變為0。那我們一個一個操作,對於d[j][j]和d[i][j](i>=j+1)
我們不斷將兩行輾轉相除,並且交換,交換的代價就是-1;
最後我們把對角線乘起來就是答案。
拓展
我們光知道這個還不行,我們還需要知道這個東西可以解決什麼問題。
無向圖
1.n個點m條邊的一張沒有重邊,沒有子環的圖,保證聯通,求生成樹個數。
我們構造一個n*n的矩陣A,對於A[i][j]來說,當 i==j 時,A[i][j]存的是i點的度數(無向圖)。當i != j 時,存的是i,j之間是否有邊,有邊為-1,沒邊就是0.
然後我們把任意的第i行和第i列挖掉,把剩下的向左上對齊,求剩下矩陣的行列式即可。(我太菜了,不知道證明)。
有向圖
2.求外向樹,把d[i][i]改成一個點的入度即可。
3.求內向樹,把d[i][i]改成一個點的出度即可。
當然要像無向圖那樣存邊和求行列式。
呼啊,說完了
相關推薦
Matrix-Tree定理及其拓展
正題 不能再半途而廢了。 讓我們現在開始講一下Matirx-Tree定理。 其實這個定理是用來解決關於“用圖建樹的方案樹”之類的問題的。 首先我們要了解幾個定理及其證明。 1.我們定義一個n*n的矩陣A,它
Matrix-Tree定理題表(已完成(ojbk))
容斥 高斯消元 正數 求逆 tree bzoj4031 精度 gpo bzoj1016 矩陣樹這個東西……並不懂什麽基爾霍夫矩陣……背了一下結論……(順便用這個東西加強了一下矩陣)(打板子的
spoj 104 Highways(Matrix-tree定理)
www. nbsp clu tree tex frame 無向圖 之間 tom spoj 104 Highways 生成樹計數,matrix-tree定理的應用。 Matrix-tree定理: D為無向圖G的度數矩陣(D[i][i]是i的度數,其他的為0)
BZOJ.1016.[JSOI2008]最小生成樹計數(Matrix Tree定理 Kruskal)
main mat 計算 def tdi str 題目 matrix include 題目鏈接 最小生成樹有兩個性質: 1.在不同的MST中某種權值的邊出現的次數是一定的。 2.在不同的MST中,連接完某種權值的邊後,形成的連通塊的狀態是一樣的。 \(Solution1\)
bzoj 1002 [FJOI2007]輪狀病毒 Matrix-Tree定理+遞推
c++ 無向圖 tps pan n+1 ref out 高精 clu 題面 題目傳送門 解法 求無向圖生成樹個數,可以直接通過Matrix-Tree定理求 但是\(n≤100\),精度肯定爆了 所以先打個表找個規律: \(1,5,16,45,121,320,841…\) 可
中國剩余定理及其拓展
align 孫子兵法 bubuko 線性同余方程組 轉化 sub prim 未知數 min 中國剩余定理及其拓展 中國剩余定理CRT引例:(選自孫子兵法) 今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何? 怎麽考慮這個問題? 按照題意: 設答案
【BZOJ3659】Which Dreamed It【有向圖歐拉回路計數】【matrix tree定理】【BEST定理】【高斯消元】
定理題... /* Think Thank Thunk */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typede
生成生成樹計數 --- Matrix-Tree定理(基爾霍夫矩陣樹定理)
模板題點這 題目大意: *一個有n座城市的組成國家,城市1至n編號,其中一些城市之間可以修建高速公路; *需要有選擇的修建一些高速公路,從而組成一個交通網路; *計算有多少種方案
生成樹計數(Matrix-Tree定理)
以下轉載自http://blog.csdn.net/jarily/article/details/8901363 /* *演算法引入: *給定一個無向圖G,求它生成樹的個數t(G); * *演算法思想: *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:
最小生成樹計數(Kruskal+Matrix-Tree定理)
以下轉載自:http://blog.csdn.net/jarily/article/details/8902402 /* *演算法引入: *給定一個含有N個結點M條邊的無向圖,求它最小生成樹的個數t(G); * *演算法思想: *拋開“最小”的限制不看,如果只要
Matrix-Tree定理(sx之前填坑還來得及嗎)
從入門到入土:矩陣樹Matrix-Tree定理 參考blog 在正式介紹Matrix_Tree定理之前,我們需要一些前置知識 一些定義與定理 對於一個無向圖GG,ta的生成樹個數等於其基爾霍夫Kirchhhoff矩陣任何一個N−1N−1階主子式的行
Matrix-Tree定理學習筆記
適用問題:給定一個n個點m條邊的無向圖,求出這個圖的生成樹的總數。 拉普拉斯矩陣求法:度數矩陣 - 鄰接矩陣 = 拉普拉斯矩陣。 度數矩陣:(i=0,1.....n-1)(i,i) = 點i的
Matrix-Tree定理(1)----矩陣的行列式
菜雞博主開始看matrix tree定理辣!開啟editorial,發現是生成樹計數相關,要用matrix tree定理,然後就一臉懵逼(智力-=2),決定學習matrix tree定理這個神奇的東西。以下內容純屬博主口胡,不足之處希望dalao予以指出與更正。前置技能:
生成樹計數-Matrix-Tree定理
/* *演算法引入: *給定一個無向圖G,求它生成樹的個數t(G); * *演算法思想: *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:當i≠j時,dij=0;當i=j時,dij等於vi的度數; *(2)G的鄰接矩陣A[G]是一個n*n的矩陣,並且滿
UVA10766(Organising the Organisation)生成樹計數-Matrix-Tree定理
/* *題目地址: *http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1707; * *題目大意:
$Matrix-Tree$定理-理論
mil 也有 wid 兩個 time 16px 跳過 主題 ora $Matrix-Tree$ 矩陣的行列式 這個東西看了好久才明白 _ (:з」∠)_ 時間不夠可以直接跳到第六段。 看到這種新定義,第一反應還是去翻百度百科: 但是這個講解真的讓人很迷惑.
數學-Matrix Tree定理證明
老久沒更了,冬令營也延期了(延期後豈不是志願者得上學了?) 最近把之前欠了好久的債,諸如FFT和Matrix-Tree等的搞清楚了(啊我承認之前只會用,沒有理解證明……),FFT老多人寫,而MatrixTree沒人證我就寫一下吧…… Matrix Tree結論 ----- Matrix Tree的結論網
矩陣樹定理(Matrix Tree)學習筆記
cstring 相關 () str eof bsp lld open csdn 如果不談證明,稍微有點線代基礎的人都可以在兩分鐘內學完所有相關內容。。 行列式隨便找本線代書看一下基本性質就好了。 學習資源: https://www.cnblogs.com/candy99/p
拓展歐拉定理及其應用
using char ++ amp color int result ace name 回顧一下上節的歐拉定理: 其化簡的形式為: a^φ(m)≡1(mod m) 就有: a^x≡a^(x%φ(m))≡a^(x%φ(m)+φ(m))(mod m) 看一道題: Given
尤拉定理、拓展尤拉定理及其應用(尤拉降冪法)
摘要 本文主要介紹了數論中的尤拉定理,進而介紹尤拉定理的拓展及應用,結合例題展示如何使用拓展尤拉定理實現降冪取模。 在數論中,尤拉定理,(也稱費馬-尤拉定理)是一個關於同餘的性質定理。瞭解尤拉定理之前先來看一下費馬小定理: a是不能被質數p整除的正整數,則有a^(p