1. 程式人生 > >Matrix-Tree定理及其拓展

Matrix-Tree定理及其拓展

正題

      不能再半途而廢了。

      讓我們現在開始講一下Matirx-Tree定理。

      其實這個定理是用來解決關於“用圖建樹的方案樹”之類的問題的。

      首先我們要了解幾個定理及其證明。

      1.我們定義一個n*n的矩陣A,它的行列式為

      \sum_p (-1)^{laowang(p)}*(A[1][p_1]*A[2][p_2]*...*A[n][p_n])

      p是1到n的一個排列,laowang(p)指的是其中的逆序對個數。其實就是排列一個p使得後面行列不相交

      2.那我們根據定義式,就可以知道,任意交換兩行i,j,行列式就會乘上-1.

      因為交換i,j兩行的時候,其他的行都是不變的,我們把這單獨兩行提出來,就會發現逆序對的改變都會恰好\pm 1

。所以我們就知道,行列式會變為原來的相反數。

      3.接著,我們還要推導一個東西,當有兩行一樣時,行列式為0.

      比如說這兩行是i,j,首先不討論這兩行,也就是說把這兩行先提出來,我們就會發現,當P_i<P_j時,我們可以知道,行列式的符號是不用改變的,因為不存在逆序對,也就是說行列式是\pm A[i][P_i]*A[j][P_j],而當P_i>P_j的時候,行列式的符號改變了,所以行列式是\mp A[i][P_i]*A[j][P_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條定理完成O(n^{3})求解行列式。

      怎麼求呢。。。

      首先我們要有一個構造的n*n的矩陣。

      像上面這個圖,空出的位置都是0,現在我們如何利用第6條定理,把他轉化為下圖呢?

      黃色表示有數,0表示這個數字為0,很多人想問為什麼要化成這個樣子,因為這時,行列式就是對角線的乘積,即為det=2*2*2*3=24

。因為除了這個取法,一定會包括一個因子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