1. 程式人生 > >$Matrix-Tree$定理-理論

$Matrix-Tree$定理-理論

mil 也有 wid 兩個 time 16px 跳過 主題 ora

$Matrix-Tree$

矩陣的行列式

  這個東西看了好久才明白 _ (:з」∠)_ 時間不夠可以直接跳到第六段。

  看到這種新定義,第一反應還是去翻百度百科:

  技術分享圖片

  但是這個講解真的讓人很迷惑...關鍵就是第二段的開頭,突然出現了“n階行列式”這麽一個詞,我到現在也沒有明白...在這個地方好像就是“n階矩陣”的意思?而且它還出現了奧妙重重的遞歸計算,導致完全看不懂行列式到底是個什麽東西。

  點開一個叫做“余子式”的詞條,裏面有這麽一句話:

  “行列式的階越低越容易計算,於是很自然地提出,能否把高階行列式轉換為低階行列式來計算。”

?  這才像話嘛,雖然沒有說行列式是什麽,但是至少說明了為什麽一上來就是一通遞歸。後來又看了一些資料,發現行列式的關鍵是“式”,而不能將它簡單地認為是一個數,否則很難理解。首先二維矩陣的行列式相當於叉積,三維矩陣的行列式也有幾何意義,就是一個平行六面體的體積。所以說了這麽多還是不知道行列式是什麽啊

?  ${det(K)=}\sum_{P}^{ }\;{(}{(-1)}^{\tau{(P)}}\times{K}_{1,p1}\times{K}_{2,p2}\times{K}_{3,p3}\times\cdots\times{K}_{N,pN}{)}$

  然後找到這麽一個式子,也是算行列式的,這裏面 $P$ 是一個$1-n$ 的排列, $\tau{(P)}$ 表示排列 $P$ 的逆序對數目。

  其實上面那些都沒什麽用處,畢竟最後我也沒弄明白...其實學這些關鍵還是要用,所以跳過證明,直接看結論:

  1.交換矩陣的兩行或兩列,行列式變號;
  2.如果矩陣有兩行或兩列完全相同,行列式為0;


  3.將矩陣某行或某列的所有元素同乘以k後,行列式的值也乘以k;
  4.將矩陣的某一行/列加上另一行/列的k倍,行列式的值不變;

  有了這些結論,事情就變得非常簡單。將矩陣用高斯消元消成一個上三角矩陣,發現一個有趣的性質:

  上三角矩陣的行列式是對角線的乘積;

  這裏要用到的是最復雜的那個行列式,當且僅當 $P$ 為 $1$ $2$ $3$ $4$ $...$ 時,連乘的那些項中才會沒有 $0$ ,所以就可以很簡單的求出行列式的值了。可喜可賀!

$Matrix-Tree$

  別忘了今天的主題是什麽呀...

  首先看一個新概念:$Kirchhoff$ 矩陣;為了理解它,還要復習兩個比較簡單的舊概念:

    度數矩陣:一個 $N \times N$ 的矩陣,其中 $D[i][i]$=$i$ 的度數;

    鄰接矩陣:一個 $N \times N$ 的矩陣,其中 $A[i][j]$=$i,j$ 間的邊數;

    $Kirchhoff$ 矩陣:$K=D-A$

  事情突然變得簡單起來....先求出$Kirchhoff$ 矩陣,任意刪掉一行一列,再求行列式,就是生成樹的個數啦!是不是非常神奇呢?復雜度 $O(n^3)$。

  對於用這種方法求出來的值,我們還可以有另一種理解方式:

  $\sum_T\prod_{e \in T} \omega_e$

  這個式子的意思是,枚舉每棵可能存在的生成樹,將邊的存在性相乘,如果每條邊都存在,也就是一棵生成樹,答案就加一。有了這個式子,就可以擴展出一些有趣的東西來了。

$Matrix-Tree$定理-理論