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\) 都是布林矩陣,所以這個矩陣比較稀疏,使用稀疏矩陣消元可以做到更加優秀的複雜度。