康復計划#5 Matrix-Tree定理(生成樹計數)的另類證明和簡單拓展


  本篇口胡寫給我自己這樣的什么都亂證一通的口胡選手 以及那些剛學Matrix-Tree,大致理解了常見的證明但還想看看有什么簡單拓展的人…

  大概講一下我自己對Matrix-Tree定理的一些理解、常見版本的證明、我自己的證明,以及簡單的一些應用(比如推廣到有向圖、推廣到生成樹邊權的乘積和什么的,非常基礎)。

  應該看到這里的人都知道Matrix-Tree定理是干什么的吧…就是統計一個無向圖的生成樹個數,表示成一個行列式。

 

1、前置定義及性質

  首先是Matrix-Tree定理相關的定義:對於一個無向圖 $ G=(V,E) $,記 $ |V|=n,|E|=m $,

  定義它的度數矩陣為 $ D_G $,對於所有 $ 1 \leq i \leq n $,第 $ i $ 行 $ i $ 列的項 $ d_{ii} $ 為點 $ i $ 的度數,其余項為 $ 0 $ ;

  定義它的鄰接矩陣為 $ A_G $,對於所有 $ 1 \leq i,j \leq n $,第 $ i $ 行第 $ j $ 列的項 $ a_{ij}= $ 點 $ i $ 到 $ j $ 的連邊數(可以有重邊)。

  定義它的基爾霍夫矩陣為 $ L_G=D_G-A_G $,即主對角線上是每個點的度數,其它地方 $ l_{ij}=-a_{ij}, i \neq j $ 。基爾霍夫矩陣的性質放在下一節進行討論。

  另外還有一個邊矩陣 $ B_{m \times n} $,每行有兩個非零元素,對於第 $ i $ 條邊 $ (s_i,t_i) $, $ b_{is_i}=1, b_{it_1}=-1 $ 。根據定義容易證明 $ L_G=B^T B $ (列出式子就是顯然的了)。這個矩陣在常見的證明方法里會用到。

 

  然后說一下需要用到的幾個行列式的基本性質。

 

  1、拉普拉斯展開

  對於行列式

   $$ D = \begin{vmatrix}a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn}\end{vmatrix} $$

  對任意的第 $ i $ 行 $ (1 \leq i \leq n) $,按下式展開,值均等於原行列式的值。

   $$ D = \sum_{j=1}^{n} (-1)^{i+j} a_{ij} M_{ij} $$

  其中 $ M_{ij} $ 稱作 $ a_{ij} $ 的余子式,代表行列式 $ D $ 去掉第 $ i $ 行和第 $ j $ 列的全部元素,剩下的行和列按原順序排列的 $ n-1 $ 階行列式。

  通過歸納法可以證明。

 

  2、行列式線性性

  (1)

   $$ \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ ka_{i1} & ka_{i2} & \cdots & ka_{in} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} = k \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix}  $$

  (2)

   $$ \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ a_{i1}+b_{i1} & a_{i2}+b_{i2} & \cdots & a_{in}+b_{in} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} = \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} + \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ b_{i1} & b_{i2} & \cdots & b_{in} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix}  $$

  這兩個性質按第 $ i $ 行展開就可以立刻得到。

 

  3、做倍加行變換,行列式值不變

   $$ \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} = \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots &  & \vdots \\ a_{i1}+ka_{j1} & a_{i2}+ka_{j2} & \cdots & a_{in}+ka_{jn} \\ \vdots & \vdots &  & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix}  $$

  可以通過歸納法證明一個性質:如果有兩行元素對應相等,則行列式值為 $ 0 $ 。有了這個性質再通過線性性即可證明。

 

  4、兩行對換,行列式反號

  通過線性性和倍加行變換即可證明。(對於 $ i,j $ 兩行對換,把第 $ j $ 行加到第 $ i $ 行上,再從第 $ j $ 行減去現在的第 $ i $ 行,然后在第 $ j $ 行提出 $ -1 $ 即可)

 

  5、上/下三角行列式的值等於主對角線元素乘積。

  直接展開即可得到。

 

2、Matrix-Tree定理及證明

  Matrix-Tree定理

    對於無向圖 $ G=(V,E) $,圖的生成樹個數等於任何一個 $ n-1 $ 階主余子式 $ M_{ii} $ (刪掉的行列編號相同的余子式)的值。

  利用這個定理,結合高斯消元求行列式(把行列式消成上三角,消元過程中行列式的值的變化由上面的性質可以算出)可以做到 $ O(n^3) $ 求出一個無向圖的生成樹個數。

  下面我們討論它的證明。

 

2.1、常見證明方法(簡略版)

  由於我沒有找很多資料,不知道有沒有用我這種方法的正式證明…所以我的證明的嚴謹性可能不會有完全的保障…所以為了防止坑到萌新,在給出我的證明方法之前還是簡略地講一下常見的證明方法吧

  首先我們注意到基爾霍夫矩陣有一些性質,它的每行元素和都是 $ 0 $,每列元素和也是 $ 0 $,所以如果我們把所有行都加到其中一行,這一行就會變成全 $ 0 $,於是如果我們按這一行展開就能得到 $ L_G = 0 $ 。

  有了這個性質,我們可以證明如果 $ G $ 不連通,那么任意 $ M_{ii}=0, 1 \leq i \leq n $ 。因為如果 $ G $ 不連通, $ L_G $ 就可以通過若干次行對換和列對換(每次交換 $ i,j $ 兩行,然后交換 $ i,j $ 兩列,那么行列式的值經過兩次反號是不變的)把通一個連通塊的編號排在一起,那么 $ L_G $ 會變成:

   $$ L_G = \begin{vmatrix}A_1 & &  & \\ & A_2 &  & \\ & & \ddots & \\ & & & A_k \end{vmatrix} $$

  其中 $ k $ 為連通塊個數, $ A_i $ 是一些矩陣,大小為對應連通塊大小。這是把原行列式給分塊了,其余位置全是 $ 0 $ 。這種對角塊矩陣具有一個性質,就是它的行列式等於所有 $ A_i $ 的行列式的乘積。證明也很簡單,只要通過高斯消元把 $ A_i $ 全部消成上三角,那么整個 $ L_G $ 也會是上三角的,所以 $ |L_G| $ 就等於 $ |A_i| $ 的乘積(它們在消元過程中產生的變化是相同的)。

  如果 $ G $ 不連通,那么 $ k \geq 2 $,於是考慮 $ L_G $ 的主余子式 $ M_{ii} $,它仍然是一個對角塊矩陣,並且至少包含了一個完整的 $ L_G $ 中的 $ A_x $ 。而因為 $ A_x $ 是一個連通塊的信息,它就是 $ G $ 的一個完整的導出子圖的基爾霍夫矩陣,所以完整的 $ A_x $ 的行列式 $ |A_x|=0 $ 。於是整個 $ |M_{ii}|=0 $ 。

  接下來還有一個性質,若 $ G $ 是樹,則 $ M_{ii}=1$ 。這個可以通過歸納法證明,這里略過,在下一部分我會給出我的證明。

  然后我們需要用到一個定理:Cauchy-Binet定理。對於一般矩陣 $ A,B $ (不一定是方陣)

   $$ |AB| = \sum_{|s|=n} |A_{s*}B_{*s}| $$

  其中 $ s $ 是集合 $ {1,2,\cdots,m} $ 的一個大小為 $ n $ 的子集, $ A_{s*} $ 表示 $ A $ 只取 $ s $ 中的列形成的 $ n \times n $ 方陣。

  因為本文重點不在這里,所以就不加證明地給出這個定理(才不是我怕寫太長或者我很懶)。

  於是通過這個定理我們可以得到

   $$ M_{ii} = |B_i^TB_i| = \sum_{|s|=n-1} |(B_i^T)_{s*}(B_i)_{*s}| $$

  其中 $ B_i $ 代表 $ B $ 刪去第 $ i $ 列后得到的 $ m \times (n-1) $ 矩陣。注意到右側就是只取 $ n-1 $ 條邊時的 $ B_i $ 的乘積,也就是 $ G $ 中只留下 $ s $ 中的邊時得到的 $ M_{ii} $,根據上面得到的兩個小性質,我們知道在剛好構成樹時它是 $ 1 $,否則一定不連通,所以是 $ 0 $ 。於是這就證明了Matrix-Tree定理。

 

2.2、我口胡的另外一個證明方法(正題)

  [注] 如果有人發現我的證明有什么地方出現了錯誤,請務必留言懟我

  前段時間我看到了一道看起來能用Matrix-Tree的推廣的題目,於是愉快地寫了一下,但是寫完之后發現我已經忘了Matrix-Tree定理怎么證明,更不用說怎么推廣了…於是我冥思苦想了幾個小時,突然發現了一些有趣的東西,這引出了對於Matrix-Tree定理的另一個理解。

  我最初是為了證明上面提到的一個性質“若 $ G $ 是樹,那么 $ M_{ii}=1 $ ”想的這個辦法。我試圖使用歸納法…(但是失敗了…引向了另外的方向)

  考慮把 $ L_G $ 刪去第一行和第一列,那么我們得到的行列式其實類似於把 $ 1 $ 號點刪去后得到的圖 $ L_{G'} $ 的基爾霍夫矩陣,但是其中有若干個點的度數並不是在 $ G' $ 中的度數,因為我們刪去一行一列時並沒有調整它們。於是實際上得到的是:

   $$ \begin{vmatrix}d'_2 + \Delta_2 & -a_{23} & \cdots & -a_{2n} \\ -a_{32} & d'_3 + \Delta_3 & \cdots & -a_{3n} \\ \vdots & \vdots & \ddots & \vdots \\ -a_{n2} & -a_{n3} & \cdots & d'_n + \Delta_n \end{vmatrix} $$

  其中 $ a_{ij} $ 是鄰接矩陣 $ A_G $ 中的元素; $ d'_i $ 是圖 $ G' $ 的度數矩陣 $ D_{G'} $ 中的元素; $ \Delta_i $ 等於 $ 1 $ 號點與 $ i $ 號點連邊數。

  因為這太相似了,所以考慮使用行列式線性性質的第(2)條把它們拆開。比如我們拆開 $ d'_3 $ 和 $ \Delta_3 $ :

   $$ \begin{vmatrix}d'_2 + \Delta_2 & -a_{23} & \cdots & -a_{2n} \\ -a_{32} & d'_3 + \Delta_3 & \cdots & -a_{3n} \\ \vdots & \vdots & \ddots & \vdots \\ -a_{n2} & -a_{n3} & \cdots & d'_n + \Delta_n \end{vmatrix} = \begin{vmatrix}d'_2 + \Delta_2 & -a_{23} & \cdots & -a_{2n} \\ -a_{32} & d'_3 & \cdots & -a_{3n} \\ \vdots & \vdots & \ddots & \vdots \\ -a_{n2} & -a_{n3} & \cdots & d'_n + \Delta_n \end{vmatrix}+\begin{vmatrix}d'_2 + \Delta_2 & -a_{23} & \cdots & -a_{2n} \\ 0 & \Delta_3 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ -a_{n2} & -a_{n3} & \cdots & d'_n + \Delta_n \end{vmatrix}  $$

  右邊的兩個還可以繼續拆開別的 $ d'_i+\Delta_i $ 。我們每拆開一項,就會讓行列式數量乘以 $ 2 $ 。如果剩下的圖中與 $ 1 $ 號點相連的點集是 $ S $,大小為 $ k $,那么就有 $ k $ 個非零的 $ \Delta_i $,我們將得到 $ 2^k $ 個行列式。

  我們斷言,這 $ 2^k $ 個行列式里面至多只有 $ 1 $ 個非零。而且這個非零的行列式就是每次展開到右邊的那個在 $ k $ 行中只含 $ \Delta_i $ 的行列式。

  這是因為原圖是一棵樹,所以去掉 $ 1 $ 號點后的每個連通塊都恰好有一個點 $ i $ 對應的 $ \Delta_i $ 是 $ 1 $ 。注意到拆出來在左邊的那個行列式在 $ i $ 所在的連通塊內的項都是正確的 $ L_{G'} $ 中的項,於是還是按照上面的方法把現在的行列式轉化為對角塊矩陣,然后現在對角線上出現了一個基爾霍夫矩陣,於是不管剩下的對角塊上是什么,行列式的值都是 $ 0 $ 。那么有可能非零的行列式就只剩下最右邊那個了。

  接下來,我們對最右邊的那個行列式的帶非零 $ \Delta $ 的 $ k $ 行都做一次按行展開,因為這 $ k $ 行里每行都只有 $ \Delta_i $ 這個位置非零,所以得到的也只有一項,這一項就是它刪掉這 $ k $ 行和 $ k $ 列的元素后的行列式,乘以所有 $ k $ 個 $ \Delta_i, i \in S $ 的乘積(這里就是 $ 1 $ )。我們看看這個行列式是什么樣子,除了我們刪去了一些行和對應列之外,剩下的部分沒有改動,這和我們最初的情況很類似,實際上這差不多是刪去 $ \{ 1 \} \cup S$ 中的點后得到的圖 $ G'' $ 的基爾霍夫矩陣,只是其中有些點的度數大於實際在 $ G'' $ 中的度數。實際上這些增加的量只會是 $ 0 $ 和 $ 1 $,因為這相當於現在我們取走的點集中與每個點相鄰的點數,而我們已經取走的點集是樹上連續的一塊,因為整張圖是一棵樹,所以剩下的每個點至多之和已經取走的點集有一條連邊。於是我們得到了和上面形式一致的結果,這意味着我們可以再做一次。

  最后會變成什么樣呢?其實如果我們一直這么做下去的話會得到 $ 1 $ 乘以一個空的行列式(但是這其實是不行的,只有一階的時候我們無法繼續展開),所以回到上一步,那就是 $ 1 $ 乘以一階行列式 $ |1| $,那么結果就是 $ 1 $ 。(然后我們就可以用常見方法證明辣)

 

  這個過程看起來有點投機取巧的味道…確實…因為我本來是知道結論的…

  不過這個過程中我受到了一些啟發,讓我覺得這種方法說不定可以推廣到一般無向圖。

  首先我們回顧我們在樹上的過程:我們選取了一個點刪去,然后找到所有與它相連的點並刪去,然后再找到所有與已經選的點集相連的點並刪去…最后所有點都被刪去了。這仿佛就是一個BFS的過程…實際上這確實就是一個BFS的過程,我們一次直接擴展了一層節點。

  為了推廣到一般無向圖,我們需要繼續考慮一下這個過程(因為樹從一個點出發的BFS過程是唯一的,但是一般無向圖有許多生成樹,對應了不同的BFS過程)。我們其中有一步得到了 $ 2^k $ 個行列式,是的,我們證明其中 $ 2^k-1 $ 個都是 $ 0 $ 之后就不管了。而在一般無向圖上並不是這樣,因為只要剩下的圖中每個連通塊至少一個點被展開成 $ \Delta $ 就可以了(只是為了避免出現某個連通塊是完整的基爾霍夫矩陣)。這一點又啟發我們發現展開這一步隱含的意義。

 

  先在樹上考慮一下:這仿佛是枚舉了已選點集和剩下點集之間的 $ k $ 條邊是否在生成樹中,因為是一棵樹,所以如果有一條邊不在就會獨立出一個連通塊,不合法。

  看起來很有道理,但是在一般無向圖上沒有道理。因為 $ k $ 是這一層的點集大小,對於一般無向圖來說,並不是每個點都只有唯一的前驅邊(可能上一層多個點都能和這個點有邊,而且一般無向圖可能有重邊),所以 $ k $ 代表的不是邊數。實際上它的意義只是枚舉了下一次要擴展的點集而已,但是可能還會有奇怪的感覺,因為一般無向圖上單靠每層的點集是無法確定生成樹的(原因還是剛剛那一句話)。我們現在重新考察一下 $ \Delta $ 來打消這個顧慮。

   $ \Delta_i $ 等於上一層已取點集中與 $ i $ 相鄰的點數。假如現在我們新擴展了一層,點集為 $ S $,那么原本BFS樹上的每種情況實際上都對應 $ \prod_{i \in S} \Delta_i $ 種情況。因為確定點集后每個點 $ i $ 選擇它的前驅邊就是 $ \Delta_i $ 種選法。當我們按 $ \Delta_i $ 所在那一行展開的時候它正好被我們提了出來,所以計數仍然是正確的。這里需要解釋一下為什么是上一層點集而不是已取的所有點,如果在上一層之前的某層就和點 $ i $ 在原圖上有邊,而點 $ i $ 當時並沒有加入,那么點 $ i $ 在剩下的行列式中的度數會變成它在剩下的圖中的實際度數(注意我們開始的展開就是分裂成“保留該點且度數為實際度數”以及“乘以 $ \Delta $ 並去掉該點”的兩個行列式),所以產生的 $ \Delta $ 實際上只與上一層有關(在樹的證明中因為樹的性質,直接用所有已取點是沒問題的,但是我們推廣到一般圖就必須更加准確地了解情況了)。

 

  我們有了大致思路之后,要來確認結論在一般無向圖上成立,我們大概要從幾個方面入手:統計的方案合法、方案不重復、方案不遺漏。

  首先我們考察合法性:如果我們某一步枚舉的擴展點集中其中一個連通塊沒有一個點被選,那么就無法BFS全圖,對應着一系列不合法的方案,而這個時候主對角線上存在一個完整的基爾霍夫矩陣,行列式值為 $ 0 $ 。並且,根據我們的統計方法,除起點外,我們只保留BFS樹上每個點與前驅的一條邊,且前驅在上一層,所以不可能出現環。所以我們統計到的方案一定是生成樹。

  然后考慮不重復和不遺漏:對於每棵生成樹,定根為起點,那么它的形態與從起點開始的BFS樹的形態是完全一致的(可以定義為 $ \forall u,v \in V, (u,v)_x \in E_{ST} \Leftrightarrow (u,v)_x \in E_{BFS} $,其中 $ E_{ST} $ 是生成樹的邊集, $ E_{BFS} $ 是BFS樹的邊集, $ (u,v)_x $ 代表的是 $ u,v $ 間的第 $ x $ 條邊,因為原圖可以有重邊)。那么通過“形態完全一致”可以定義一個BFS樹與生成樹之間的一一映射,所以統計所有BFS樹就等價於統計所有生成樹。然后,我們在每一步通過 $ 2^k $ 枚舉了所有可能的下一層點集,並且通過 $ \prod_{i \in S} \Delta_i $ 算出了相鄰兩層間的連邊方案,根據簡單的計數原理,我們可以確定我們不重不漏地統計了所有BFS樹。

  於是Matrix-Tree定理在一般無向圖上成立。

  這就是我對Matrix-Tree的證明方法啦(實際上也不算正式的證明…但是整理一下可以寫成正式的證明…不過我想等更加確定它的正確性以后再說)。

 

3、簡單的拓展

  Matrix-Tree從定理角度的拓展其實不是很多…無非是推廣到統計別的東西,或者推廣到有向圖。

 

3.1.1、推廣到統計邊權乘積的和

  其實有一個簡單暴力的推廣辦法,因為我們上面的證明支持有重邊的圖,所以如果邊權是整數,我們直接在兩個點之間連上邊權那么多條邊,得到的生成樹個數就是所有生成樹的邊權乘積的和了。如果不是整數,是有理數的話,我們考慮所有邊權的最簡分母的一個公倍數 $ t $,我們把每條邊的邊權乘以 $ t $,然后統計的結果除以 $ t^{n-1} $ 就能得到我們要的結果了,考慮利用行列式線性性質(1)把 $ t^{n-1} $ 分進行列式里,剛好可以讓基爾霍夫矩陣的任意一個主余子式的每一行的所有元素除以 $ t $,所以這等價於我們一開始就把基爾霍夫矩陣的每一個元素除以 $ t $ 。這樣我們得到了一個推廣的基爾霍夫矩陣,里面連邊數量改成了邊權和,度數改成了這個點連出去的邊的邊權和,並且Matrix-Tree定理在所有元素都是有理數的情況下成立。對於計算機上的浮點數來說這就夠了,因為它們都是有理數。

  不過上面這個只是一個小技巧而已,實際上也可以正常地推廣,只要考察上面的證明中有什么地方不一樣了,再驗證它們是否能夠保持成立即可(有時我們還會進一步修改證明過程中的定義,就像從樹的證明推廣到一般無向圖一樣)。實際上邊權乘積剛好符合了我們的過程(因為我們用的就是 $ \prod $ ),而邊權和就不行了。如果要正經地證明推廣的話只是多說一些廢話,並沒有什么有價值的思想,這里就不啰嗦了。

 

3.1.2、推廣到有向圖

  到有向圖上可能定理就有點變樣了,但大致還是在的…首先鄰接矩陣改成只記出邊,度數矩陣改成了只記入度,然后現在得到的基爾霍夫矩陣的主余子式 $ M_{ii} $ 代表了以 $ i $ 為根的有向生成樹個數。

  這下基爾霍夫矩陣的變化比較明顯,它不是對稱的了,並且它的每行元素的和也不再一定是 $ 0 $ 了(現在是一個點的入度減去出邊數)。但是好在每一列的和還是 $ 0 $,所以最重要的性質還沒有改變,仍然可以全部行加到一行上來證明它的行列式為 $ 0 $ 。而不連通的圖的基爾霍夫矩陣的主余子式的值為 $ 0 $ 這一條出現了改變,變成如果從 $ i $ 點出發不能到達所有點,則 $ M_{ii}=0 $,證明還是類似的,取不能到達的點排在一起,在主對角線上形成一塊基爾霍夫矩陣。接下來刪點的時候,出現 $ \Delta $ 的就是這一層點集的出邊影響到的點。計數的時候原理沒有變化,仍然是成立的。大致就是這樣推廣到有向圖上。

  另外這和上一個推廣沒有什么沖突的地方,兩個推廣結合在一起也是可以的。

 

3.2、例子

  有了定理上的推廣,用法上就有更多的變化了。這里稍微舉兩個小例題看看。

 

3.2.1、[SDOI2014]重建

  給定一個圖,每條邊有一個出現概率 $ p_i $,問得到原圖的一個生成樹的概率。數據范圍是 $ n \leq 50 $ 。

  如果考慮最暴力的做法,枚舉子集然后DP的話,可以通過預處理每個子集與外界恰好只有一條邊的概率做到 $ O(3^n+n^22^n) $ 的復雜度。但是這個復雜度太高,一秒只能處理大約 $ 16 $ 上下的 $ n $ 。

  其實我們可以通過Matrix-Tree定理來做,因為我們寫出答案的求和式就能知道是對“所有樹邊出現概率的乘積乘以所有非樹邊不出現的概率的乘積”求和,我們在這個式子里直接除以所有邊不出現的概率的乘積,那么要求和的就變成“所有樹邊的出現概率除以它的不出現概率的乘積”了。我們把這個作為邊權,用一次推廣的Matrix-Tree定理就可以了。用這種方法的話算 $ 500 $ 左右的 $ n $ 都沒有問題。另外這題還有一些細節,和我們的主題無關,就不討論了。

 

3.2.2、畢老爺在冬令營上舉的其中一個例子

  給定一個圖,圖上每條邊是紅色或藍色,求恰有 $ k $ 條紅邊的生成樹個數。 $ n \leq 50 $ 。

  這個就是沒什么懸念的Matrix-Tree定理了,對於限制條件可以利用多項式,把紅邊邊權設為 $ x $,藍邊為 $ 1 $ 。那么最后求行列式得到的多項式中 $ x^k $ 的系數就是答案了。同樣這也是利用了邊權乘積的那個推廣。至於多項式情況下不方便高斯消元的問題,通過代入具體的數插值求多項式就可以解決問題。

 

4、總結

  所以Matrix-Tree是一個挺妙的東西…從我的這種證明方法來看,Matrix-Tree實際上是把純粹的指數級暴力搜索過程集中在了行列式之中,而行列式憑借着數學上的基礎存在比較快速的計算方法,從而很好地解決了計算上的困難。類似的思想還有Lindström–Gessel–Viennot_lemma引理,它除了巧妙地進行了不合法情況的消除以外,還利用了它的式子與行列式定義的一致性,把階乘級的復雜度降到了多項式級,同樣是很聰明的解決辦法。

  (最后再提醒一次…如果看到有哪里不對,記得留言懟我QwQ)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM