矩陣樹定理 \(\text{BEST}\) 定理
證明很複雜,連 \(\text{cmd}\) 這種無敵神犇都不會,而且對定理本身的可擴充套件性幾乎為 \(0\),即每次套用的定理都跟模板一模一樣。
矩陣樹
無論任何情況,一定要不能有自環
無論任何情況,一定要不能有自環
無論任何情況,一定要不能有自環
對於無向無權圖,設 \(A\) 為鄰接矩陣,\(D\) 為度數矩陣,定義基爾霍夫矩陣為 \(K=D-A\),那麼生成樹個數為去掉任意的第 \(k\) 列第 \(k\) 行的餘子式。
對於有向圖,設 \(A\) 為鄰接矩陣,\(D^{in}/D^{out}\) 為入度/出度矩陣,同樣定於 \(K^{in}/K^{out}=D^{in}/D^{out}-A\)
以 \(k\) 為根的外向樹個數為 \(K^{in}\) 去掉第 \(k\) 行第 \(k\) 列的餘子式。
以 \(k\) 為根的內向樹個數為 \(K^{out}\) 去掉第 \(k\) 行第 \(k\) 列的餘子式。
加權擴充套件,如果每個點帶權的話那麼的是所有生成樹邊權乘積的和。
即求的是:
此時鄰接矩陣的值為邊權,度數矩陣為邊權和。
對於矩陣數的一個小最佳化:因為最終的答案一定不可能是負數,所以算行列式的時候可以不用記錄當前值的正負號。
P6178 【模板】Matrix-Tree 定理
模板。
P4336 SHOI2016] 黑暗前的幻想鄉
發現每個公司恰好搞一條邊有點煩,還是轉容斥。
設 \(f(S)\) 表示欽定集合 \(S\) 內的元素不能搞邊的方案數。
那麼有:
P3317 SDOI2014] 重建
本題求的是:
為了防止分母為 \(0\),需要擾動一下。
P6624 省選聯考 2020 A 卷] 作業題
先煎蛋地化簡下式子
發現內層求的是所有生成樹的邊權和的和,這與我們能幹的求所有生成樹的邊權積的和。
那麼這裡有兩種常見手法,一種是取對數/\(\text{exp}\) 將乘法與加法相互轉換,還有一種也就是這道題的方法。
考慮把邊權變為 \((1+w_ix)\),那麼最終我們只需要求得最後的一次項係數即可。
那麼就需要重新定義加建乘除
設當前兩個多項式分別為 \(a+bx\) 和 \(c+dx\)。
加法減法就是對應項加減。
乘法即為:\((a+bx)(c+dx)=ac+(ad+bc)x\)
除法:\(\dfrac{a+bx}{c+dx}\)
考慮先手動將 \(c+dx\) 求逆變乘法。
\((c+dx)(e+fx)=1 (\text{mod} \ \ x^2)\)
帶入 \(x=0\) 以及 \(x=1\) 得到:
那麼:
直接做為 \(O(n^3V)\),\(V\) 為值域,有點爆。
最佳化:注意到只有當可選邊個數大於等於 \(n-1\) 的所有 \(d\) 求行列式即可。
P5296 北京省選集訓2019] 生成樹計數
發現求的是 \(k\) 次方和,比上面那個更加複雜。
依葫蘆畫瓢,將邊權設為 \((1+x+……+x^k)\)。
但是在重新定義乘法的時候不太對,假設前一個多項式為 \(A_0,A_1,\cdots A_k\),後一個為 \(B_{0},B_{1},\cdots,B_k\)
乘法的時候為:
這與正常的卷積不太一樣,把組合數開啟:
那我們只需要把初始的比設定成
再推一下暴力多項式求逆的方法:
求逆相當於是給定一個 \(A\),求 \(B\)。
那麼有:
最後再套上矩陣樹即可。
P4208 JSOI2008] 最小生成樹計數
首先注意到無論怎麼變換順序,最終邊權形成的集合一定相等。
那麼考慮先對求出每種權值出現了多少次,然後對於每種權值,加入
所有不是這種權值的樹邊,然後並查集縮點,加入所有這種權值的邊跑矩陣樹求出方案數。
最終答案為每種權值得到的答案的乘積。
【UR #6】智商鎖
鮮花:我還做這道題前也想到了同樣的idea,蛤蛤蛤。
首先把 \(k=0\) 的情況判掉。
一種樸素的想法是直接隨機一個圖然後看看它的生成樹個數是否恰好為 \(k\) ,每次成功的機率為 \(\dfrac{1}{998244353}\),沒救。
注意到對於一個圖,答案為每個邊雙連通分量的生成樹的個數乘積,原因是割邊必須選。
那你考慮將圖分為 \(4\) 個部分,每個部分 \(25\) 個點,然後隨機 \(1000\) 個 \(25\) 個點的圖跑矩陣樹,那麼只要存在四個圖 \(A,B,C,D\) 設 \(f(S)\) 為圖 \(S\) 的生成樹個數。
那麼只要存在 \(f(A)f(B)f(C)f(D)\equiv k (mod \ \ 998244353)\) 即可。
\(f(S)\) 是隨機生成,可以近似為一個隨機數,那麼可以近似為產生 \(1000^4\) 個隨機數,那麼極大機率能找到一個特定的 \(k\)。
\(f(A)f(B)\) 這種成對的值放入 \(\text{map}\) 內,每次遍歷每個值,看看 \(\dfrac{k}{f(A)f(B)}\) 是否存在即可。
最後把找到的 \(4\) 個圖 \(A,B,C,D\) 順次排布,然後 \((A,B),(B,C),(C,D)\) 分別連一條邊即可。
\(\text{BEST}\) 定理
說的是對於一個有向 尤拉圖 ,記第 \(i\) 個點的出度為 \(out_i\) ,其本質不同尤拉回路個數為:
\(T\) 為任意一個點為根內向樹個數。(u 群有大佬證明說任意一個點為根的答案全相等)
注意一定是有向的尤拉圖。
要使用定理前一定要判斷是否為尤拉圖。
注意:這裡把迴圈同構的尤拉回路只計算了一遍,如果從第 \(i\) 個點為起點和終點的尤拉回路數量還需要乘以 \(out_i\)
P5807 【模板】BEST 定理 | Which Dreamed It
板子題,直接做就好了。
[AGC051D] C4
注意到這是無向圖,考慮列舉 \(1\to 2,2\to 3,3\to 4,4\to 1\) 分別的個數為 \(a,b,c,d\),那麼反過來的個數為 \(A-a,B-b,C-c,D-d\),大寫字母表示無向圖時的邊權。
此時複雜度爆了,但是你注意到最終一定要是尤拉圖,也就是出入都要平衡,那麼只要確定了 \(a\) 那所有的都確定了。
確定了每條邊的個數後直接跑尤拉回路板子即可。
注意到本體同起點同終點的邊不做區分,那麼最後要乘以 \(\dfrac{1}{a!b!c!d!(A-a)!(B-b)!(C-c)!(D-d)!}\)
複雜度 \(O(A)\)
擴充套件:求無向圖的尤拉回路數量?
別想了哥們,這是 \(\text{NPC}\)
P7531 USACO21OPEN] Routing Schemes P
注意到每條邊需要恰好出現一次,這與尤拉回路的定義很像。
考慮轉化,建立一個源點和匯點,每次源點連向所有起點,所有終點連向匯點,然後匯點向源點連 \(n\) 條邊,\(n\) 為起點終點個數。
然後答案為以源點為根的尤拉回路個數,但是匯點和源點連出去的邊是不區分,最後還需除以 \(out_S!out_T!\)。