1. 程式人生 > >矩陣樹定理學習筆記+洛谷3317 bzoj3534 SDOI2014 重建 矩陣樹定理+期望 +構造

矩陣樹定理學習筆記+洛谷3317 bzoj3534 SDOI2014 重建 矩陣樹定理+期望 +構造

題目連結
題意就是給你n個點,每兩個點之間有一條邊,這條邊存在的概率是p,求生成樹個數。
我覺得這真是道神題!
首先先介紹一下矩陣樹定理,由於我不會,所以沒有給任何證明,只給了結論,想知道證明請自行搜尋。矩陣樹定理可以求一個無向圖的生成樹個數(似乎有向的也可以求,但是我還不會)。它的做法是這樣的:用鄰接矩陣存邊,aij(ij)的值為點i到點j的邊數的相反數,aii的值為點i的度數。生成樹個數就是任意一個餘子式Mii的值,餘子式Mij是一個行列式去掉第i行第j列後的結果。求行列式的值可以用高斯消元,把行列式消成階梯型的(上三角),最終的答案是行列式對角線上所有數的乘積。
說明一下要用到的兩種行列式的初等變換:
1.互換行列式的兩行,行列式的值變為原來的相反數
2.將行列式一行的若干倍加到另一行,行列式的值不變
這兩種變換保證了在高斯消元時只有互換兩行時會改變原行列式的值,我們在進行消元的過程中只需要再記錄一下改變次數的奇偶即可。
我一開始就跪了!我一開始以為答案是

Treeepe,也就是直接把基爾霍夫矩陣中的度數矩陣中aij(ij)設為ij有邊的期望,然後aii設為除了i本身的所有點與它之間有連邊的期望之和,然後做矩陣樹定理,於是我發現根本過不了樣例。看了題解後我真的不由得感嘆這題的絕妙。我們來看一下它的正確做法。
首先,第一個妙處在於對於任意一棵生成樹,它存在的條件應該是所有在這棵樹上的邊都存在,所有不在這棵樹上的邊都不存在。那麼根據乘法原理,任意一棵生成樹存在的概率應該是eTreepeeTree(1pe) 所有我們要求的應該是TreeeTreepeeTree(1pe) 我們發現好像並不知道該怎麼樣直接求出這個式子的值。但是我們發現,用我之前那種錯誤的做法,我們可以得到Treeepe的值,那麼現在開始了本題的又一個神奇之處了:構造!我們考慮去構造這個答案。我們讓原來的pij變為pij1pij(ij),令pii=j=1npij(ij),由於我們是去構造最終答案,所以並不需要考慮原行列式的值發生了怎樣的變化。
另外我們在高斯消元之前還要記錄下e(1pe)
進行高斯消元並按照矩陣樹定理計算答案的話,我們這時就會得到
TreeeTreepe1pe
那麼我們再乘上之前記錄的e(1pe),會得到