一類生成樹計數問題。

暗蓝色的星空發表於2024-03-09

statement

給定數列 \(w_1,w_2\cdots w_n,w_i\in [1,m]\) ,考慮一個 \(n\) 個點的圖,節點 \(i,j\) 之間的邊的個數為 \(\sum\limits_{k=1}^m a_{k,w_i}b_{k,w_j}c_k\),你需要求出這個圖的生成樹個數。

solution

設度數矩陣為 \(D\),鄰接矩陣為 \(G\),由矩陣樹定理,我們要計算 \(\det(D-G)\)(需要去掉一行一列,這個不影響啥)。

考慮令矩陣 \(A_{i,k}=a_{k,w_i}c_k\),矩陣 \(B_{i,k}=b_{k,w_i}\) ,那麼 \(G=AB^{T}\)

引理:Matrix Determinant Lemma
\(A\) 為方陣 ,\(u,v\) 為列向量 ,那麼 \(\det(A+uv^T)=\det(A)\det(I+v^TA^{-1}u)\) ,證明略。

把這裡的 \(u,v\) 換成 \(n\times m\) 的矩陣不影響正確性,綜上:

\(\det(D-G)=\det(D-AB^T)=\det(D)\det(I_m-B^TD^{-1}A)\)

其中 \(D\) 是對角矩陣行列式好算,後面是一個 \(m\times m\) 的矩陣。

更具體的,我們考慮這個 \(m\times m\) 矩陣的每一個位置是啥:

首先 \(B^TD^{-1}\),因為 \(D\) 是對角矩陣,所以逆矩陣就是把每個位置取逆。
那麼\((B^TD^{-1})_{i,j}=b_{i,w_j}D^{-1}_{j,j}\)\((B^TD^{-1}A)_{i,j}=\sum_{k=1}^nb_{i,w_k}D^{-1}_{k,k}a_{j,w_k}c_j\)

直接計算行列式可以做到 \(O(n+m^3)\) 的複雜度。

很多題中,\(A,B\) 都是布林矩陣,所以這個矩陣比較稀疏,使用稀疏矩陣消元可以做到更加優秀的複雜度。

相關文章