符号规定
P ( n ) P(n) P ( n ) 为所有 n n n 阶排列构成的集合;
σ ( p ) \sigma(p) σ ( p ) 为排列 p p p 的逆序对个数;
p − 1 p^{-1} p − 1 为排列 p p p 的逆排列,即满足 p p i − 1 = i p^{-1}_{p_i}=i p p i − 1 = i ;
A T A^T A T 为矩阵 A A A 的转置矩阵;
[ n ] [n] [ n ] 为集合 { 1 , 2 , 3 , … , n } \{1,2,3,\dots,n\} { 1 , 2 , 3 , … , n } ;
( [ n ] m ) \binom{[n]}{m} ( m [ n ] ) 为从 { 1 , 2 , 3 , … , n } \{1,2,3,\dots,n\} { 1 , 2 , 3 , … , n } 中所有大小为 m m m 的子集构成的集合;
行列式
对于一个 n × n n\times n n × n 的方阵 A A A ,定义其行列式:
∣ A ∣ = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n A i , p i |A|=\sum\limits_{p\in P(n)} (-1)^{\sigma(p)}\prod\limits_{i=1}^n A_{i,p_i}
∣ A ∣ = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n A i , p i
非方阵的行列式为 0 0 0 。
几何意义:线性变换后”体积“的变化量,即原先 1 1 1 单位变为 ∣ A ∣ |A| ∣ A ∣ 单位。
行列式的基本性质 & 高斯消元求解
若 A A A 非满秩矩阵,则 ∣ A ∣ = 0 |A|=0 ∣ A ∣ = 0 ;
证明
考虑行列式的几何意义,若 A A A 非满秩,则变换后的基向量会共线,则”体积“显然为 0 0 0 。
∣ A T ∣ = ∣ A ∣ |A^T|=|A| ∣ A T ∣ = ∣ A ∣ ;
对于 A A A ,将其中的某一行同时乘常数 k k k ,则 ∣ A ∣ |A| ∣ A ∣ 也会乘上 k k k ;
对于 A A A ,交换其中的某两行,则 ∣ A ∣ |A| ∣ A ∣ 会变为 − ∣ A ∣ -|A| − ∣ A ∣ ;
证明
相当于证明交换排列 p p p 中任意两个不同的数会改变排列逆序对个数的奇偶性。
不难发现交换 p i p_i p i 和 p i + 1 p_{i+1} p i + 1 是成立的,而交换 p i p_i p i 和 p j p_j p j (i < j i<j i < j )可以看作先将 p i p_i p i 一个一个往右交换到 p j p_{j} p j 的右边,再将 p j p_j p j 一个一个往左交换到 p i p_i p i 原来的位置。
第一步交换总共需要 j − i j-i j − i 次,第二步则需要 j − i − 1 j-i-1 j − i − 1 次,而 2 ( j − i ) − 1 2(j-i)-1 2 ( j − i ) − 1 是一个奇数,所以整个过程逆序对个数奇偶性一定会改变。
对于 A A A ,将一行乘上常数 k k k 再整体加到另一行,则 ∣ A ∣ |A| ∣ A ∣ 不变;
证明
记新的方阵为 A ′ A' A ′ ,假设是将第 i i i 行加到第 j j j 行。
考虑乘法分配律,将被加的行拆开,则 ∣ A ′ ∣ = ∣ A ∣ + k ∣ B ∣ |A'|=|A|+k|B| ∣ A ′ ∣ = ∣ A ∣ + k ∣ B ∣ ,其中 B B B 的第 j j j 行和第 i i i 行相同,则显然 B B B 非满秩,∣ B ∣ = 0 |B|=0 ∣ B ∣ = 0 ,得证。
那么根据这些基本性质,可以使用高斯消元将方阵的下半消成全 0 0 0 ,即 ∀ j < i , A i , j = 0 \forall j<i,A_{i,j}=0 ∀ j < i , A i , j = 0 。
这样显然 ∣ A ∣ = ∏ i = 1 n A i , i |A|=\prod\limits_{i=1}^n A_{i,i} ∣ A ∣ = i = 1 ∏ n A i , i ,因为其它排列必然会存在某个 i i i 使得 A i , p i = 0 A_{i,p_i}=0 A i , p i = 0 。
当然将上半消成全 0 0 0 也是可以的。
交换两行的时候别忘了变号,时间复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
参考代码
inline int gauss(int n)
{
int res=1;
for(int i=1;i<=n;i++)
{
if(a[i][i]==0)
{
bool f=false;
for(int j=i+1;j<=n;j++)
{
if(a[j][i]==0) continue;
f=true;
for(int k=1;k<=n;k++) swap(a[i][k],a[j][k]);
break;
}
if(!f) return 0;
res=p-res;
}
res=1ll*res*a[i][i]%p;
for(int j=i+1;j<=n;j++)
{
if(a[j][i]==0) continue;
int ml=1ll*a[j][i]*qpow(a[i][i],p-2)%p;
for(int k=1;k<=n;k++) add(a[j][k],p-1ll*ml*a[i][k]%p);
}
}
return res;
}
Cauchy-Binet 定理
设 A A A 是一个 n × m n\times m n × m 的矩阵,B B B 是一个 m × n m\times n m × n 的矩阵,则:
∣ A B ∣ = { 0 m < n ∑ S ∈ ( [ m ] n ) ∣ A [ n ] , S ∣ × ∣ B S , [ n ] ∣ m ≥ n |AB|=\begin{cases}
0&m<n\\
\sum\limits_{S\in \binom{[m]}{n}} |A_{[n],S}|\times |B_{S,[n]}| &m\ge n
\end{cases}
∣ A B ∣ = ⎩ ⎪ ⎨ ⎪ ⎧ 0 S ∈ ( n [ m ] ) ∑ ∣ A [ n ] , S ∣ × ∣ B S , [ n ] ∣ m < n m ≥ n
第二条的意思是,枚举 { 1 , 2 , 3 , … , m } \{1,2,3,\dots,m\} { 1 , 2 , 3 , … , m } 的所有大小为 n n n 的子集 S S S ,将 1 ≤ i ≤ n , j ∈ S 1\le i\le n,j\in S 1 ≤ i ≤ n , j ∈ S 的所有 A i , j A_{i,j} A i , j 拿出来按照原来的顺序组成一个方阵,记为 A [ n ] , S A_{[n],S} A [ n ] , S ,同理定义 B S , [ n ] B_{S,[n]} B S , [ n ] ,求出其行列式的积的和。
证明
考虑矩阵乘法的本质,有:
∣ A B ∣ = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n ( A B ) i , p i = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n ∑ j = 1 m A i , j × B j , p i = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∑ j 1 = 1 m ∑ j 2 = 1 m ∑ j 3 = 1 m ⋯ ∑ j n = 1 m ∏ i = 1 n A i , j i × B j i , p i (应用乘法分配律) = ∑ j 1 = 1 m ∑ j 2 = 1 m ∑ j 3 = 1 m ⋯ ∑ j n = 1 m ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n A i , j i ∏ i = 1 n B j i , p i = ∑ j 1 = 1 m ∑ j 2 = 1 m ∑ j 3 = 1 m ⋯ ∑ j n = 1 m ( ∏ i = 1 n A i , j i ) ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n B j i , p i \begin{aligned}
|AB|&=\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^{n}(AB)_{i,p_i}\\
&=\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^{n}\sum\limits_{j=1}^m A_{i,j}\times B_{j,p_i}\\
&=\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\sum\limits_{j_1=1}^m\sum\limits_{j_2=1}^m\sum\limits_{j_3=1}^m\dots \sum\limits_{j_n=1}^m\prod\limits_{i=1}^{n}A_{i,j_i}\times B_{j_i,p_i}\qquad \text{(应用乘法分配律)}\\
&=\sum\limits_{j_1=1}^m\sum\limits_{j_2=1}^m\sum\limits_{j_3=1}^m\dots \sum\limits_{j_n=1}^m\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^{n}A_{i,j_i}\prod\limits_{i=1}^nB_{j_i,p_i}\\
&=\sum\limits_{j_1=1}^m\sum\limits_{j_2=1}^m\sum\limits_{j_3=1}^m\dots \sum\limits_{j_n=1}^m\left(\prod\limits_{i=1}^{n}A_{i,j_i}\right)\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^nB_{j_i,p_i}\\
\end{aligned}
∣ A B ∣ = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n ( A B ) i , p i = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n j = 1 ∑ m A i , j × B j , p i = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) j 1 = 1 ∑ m j 2 = 1 ∑ m j 3 = 1 ∑ m ⋯ j n = 1 ∑ m i = 1 ∏ n A i , j i × B j i , p i ( 应用乘法分配律 ) = j 1 = 1 ∑ m j 2 = 1 ∑ m j 3 = 1 ∑ m ⋯ j n = 1 ∑ m p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n A i , j i i = 1 ∏ n B j i , p i = j 1 = 1 ∑ m j 2 = 1 ∑ m j 3 = 1 ∑ m ⋯ j n = 1 ∑ m ( i = 1 ∏ n A i , j i ) p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n B j i , p i
注意到 ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n B j i , p i \sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^nB_{j_i,p_i} p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n B j i , p i 就是 ∣ B { j i } , [ n ] ∣ |B_{\{j_i\},[n]}| ∣ B { j i } , [ n ] ∣ (逆排列逆序对个数不变,即按行描述和按列描述本质相同),而若 j i j_i j i 中有重复元素,则其非满秩,行列式为 0 0 0 ,故有:
∣ A B ∣ = ∑ S ∈ ( [ m ] n ) ∑ q ∈ P ( n ) ( ∏ i = 1 n A i , S q i ) ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n B S q i , p i = ∑ S ∈ ( [ m ] n ) ∑ q ∈ P ( n ) ( ∏ i = 1 n A i , S q i ) ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n B S i , q p i − 1 = ∑ S ∈ ( [ m ] n ) ∑ q ∈ P ( n ) ( ∏ i = 1 n A i , S q i ) ∑ p ∈ P ( n ) ( − 1 ) σ ( q − 1 ) ( − 1 ) σ ( p ) ∏ i = 1 n B S i , p i = ∑ S ∈ ( [ m ] n ) ( ∑ q ∈ P ( n ) ( − 1 ) σ ( q ) ∏ i = 1 n A i , S q i ) ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n B S i , p i = ∑ S ∈ ( [ m ] n ) ∣ A [ n ] , S ∣ × ∣ B S , [ n ] ∣ \begin{aligned}
|AB|&=\sum\limits_{S\in\binom{[m]}{n}}\sum\limits_{q\in P(n)}\left(\prod\limits_{i=1}^{n}A_{i,S_{q_i}}\right)\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^nB_{S_{q_i},p_i}\\
&=\sum\limits_{S\in\binom{[m]}{n}}\sum\limits_{q\in P(n)}\left(\prod\limits_{i=1}^{n}A_{i,S_{q_i}}\right)\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^nB_{S_i,q^{-1}_{p_i}}\\
&=\sum\limits_{S\in\binom{[m]}{n}}\sum\limits_{q\in P(n)}\left(\prod\limits_{i=1}^{n}A_{i,S_{q_i}}\right)\sum\limits_{p\in P(n)}(-1)^{\sigma(q^{-1})}(-1)^{\sigma(p)}\prod\limits_{i=1}^nB_{S_i,p_i}\\
&=\sum\limits_{S\in\binom{[m]}{n}}\left(\sum\limits_{q\in P(n)}(-1)^{\sigma(q)}\prod\limits_{i=1}^{n}A_{i,S_{q_i}}\right)\sum\limits_{p\in P(n)}(-1)^{\sigma(p)}\prod\limits_{i=1}^nB_{S_i,p_i}\\
&=\sum\limits_{S\in \binom{[m]}{n}} |A_{[n],S}|\times |B_{S,[n]}|
\end{aligned}
∣ A B ∣ = S ∈ ( n [ m ] ) ∑ q ∈ P ( n ) ∑ ( i = 1 ∏ n A i , S q i ) p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n B S q i , p i = S ∈ ( n [ m ] ) ∑ q ∈ P ( n ) ∑ ( i = 1 ∏ n A i , S q i ) p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n B S i , q p i − 1 = S ∈ ( n [ m ] ) ∑ q ∈ P ( n ) ∑ ( i = 1 ∏ n A i , S q i ) p ∈ P ( n ) ∑ ( − 1 ) σ ( q − 1 ) ( − 1 ) σ ( p ) i = 1 ∏ n B S i , p i = S ∈ ( n [ m ] ) ∑ ⎝ ⎛ q ∈ P ( n ) ∑ ( − 1 ) σ ( q ) i = 1 ∏ n A i , S q i ⎠ ⎞ p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n B S i , p i = S ∈ ( n [ m ] ) ∑ ∣ A [ n ] , S ∣ × ∣ B S , [ n ] ∣
例题:
LGV 引理
对于一个带权 DAG G G G ,定义如下符号:
对于一条路径 p p p ,w p w_{p} w p 为路径上所有边边权的积;
对于两个点 u , v u,v u , v ,e u , v e_{u,v} e u , v 为 u → v u\to v u → v 的所有路径 p p p 的 w p w_p w p 之和,即 e u , v = ∑ p ∈ { u → v } w p e_{u,v}=\sum\limits_{p\in\{u\to v\}} w_p e u , v = p ∈ { u → v } ∑ w p ;
一组由起点集合 A A A 到终点集合 B B B (∣ A ∣ = ∣ B ∣ |A|=|B| ∣ A ∣ = ∣ B ∣ )的不相交路径 ( S , p i ) (S,p_i) ( S , p i ) :
∣ S ∣ = ∣ A ∣ |S|=|A| ∣ S ∣ = ∣ A ∣ 且 S i S_i S i 是一条由 A i A_i A i 到 B p i B_{p_i} B p i 的路径,其中 p ∈ P ( ∣ A ∣ ) p\in P(|A|) p ∈ P ( ∣ A ∣ ) ,且 ∀ i = j \forall i\not=j ∀ i = j ,S i S_i S i 和 S j S_j S j 没有公共点;
LGV 引理指出:
∣ [ e A 1 , B 1 e A 1 , B 2 … e A 1 , B n e A 2 , B 1 e A 2 , B 2 … e A 2 , B n ⋮ ⋮ ⋱ ⋮ e A n , B 1 e A n , B 2 … e A n , B n ] ∣ = ∑ ( S , p ) ( − 1 ) σ ( p ) ∏ i = 1 ∣ A ∣ w S i \left|\begin{bmatrix}
e_{A_1,B_1}&e_{A_1,B_2}&\dots&e_{A_1,B_n}\\
e_{A_2,B_1}&e_{A_2,B_2}&\dots&e_{A_2,B_n}\\
\vdots&\vdots&\ddots&\vdots\\
e_{A_n,B_1}&e_{A_n,B_2}&\dots&e_{A_n,B_n}
\end{bmatrix}\right|=\sum\limits_{(S,p)}(-1)^{\sigma(p)}\prod\limits_{i=1}^{|A|} w_{S_i}
∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ⎣ ⎢ ⎢ ⎢ ⎡ e A 1 , B 1 e A 2 , B 1 ⋮ e A n , B 1 e A 1 , B 2 e A 2 , B 2 ⋮ e A n , B 2 … … ⋱ … e A 1 , B n e A 2 , B n ⋮ e A n , B n ⎦ ⎥ ⎥ ⎥ ⎤ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ = ( S , p ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ ∣ A ∣ w S i
证明
考虑行列式的定义,设等号左边的矩阵为 C C C ,∣ A ∣ = n |A|=n ∣ A ∣ = n ,则:
∣ C ∣ = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n e A i , B p i = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∏ i = 1 n ∑ q ∈ { A i → B p i } w q = ∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∑ q 1 ∈ { A 1 → B p 1 } ∑ q 2 ∈ { A 2 → B p 2 } ⋯ ∑ q n ∈ { A n → B p n } ∏ i = 1 n w q i \begin{aligned}
|C|&=\sum\limits_{p\in P(n)}\limits (-1)^{\sigma(p)} \prod \limits_{i=1}^n e_{A_i,B_{p_i}}\\
&=\sum\limits_{p\in P(n)}\limits (-1)^{\sigma(p)} \prod \limits_{i=1}^n \sum\limits_{q\in \{A_i\to B_{p_i}\}}w_q\\
&=\sum\limits_{p\in P(n)}\limits (-1)^{\sigma(p)}\sum\limits_{q_1\in \{A_1\to B_{p_1}\}}\sum\limits_{q_2\in \{A_2\to B_{p_2}\}}\dots \sum\limits_{q_n\in\{A_n\to B_{p_n}\}}\prod\limits_{i=1}^n w_{q_i}\\
\end{aligned}
∣ C ∣ = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n e A i , B p i = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ n q ∈ { A i → B p i } ∑ w q = p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) q 1 ∈ { A 1 → B p 1 } ∑ q 2 ∈ { A 2 → B p 2 } ∑ ⋯ q n ∈ { A n → B p n } ∑ i = 1 ∏ n w q i
不难发现,由于 w q i w_{q_i} w q i 是路径边权积,所以 ∏ i = 1 n w q i \prod\limits_{i=1}^n w_{q_i} i = 1 ∏ n w q i 实际上相当于 q [ 1 , n ] q_{[1,n]} q [ 1 , n ] 这些路径经过的可重边集的边权积。
此时若 q i q_i q i 与 q j q_j q j 有公共点,那么交换它们最后一个公共点后的路径会使得 σ ( p ) \sigma(p) σ ( p ) 奇偶性改变,而 ∏ i = 1 n w q i \prod\limits_{i=1}^n w_{q_i} i = 1 ∏ n w q i 并不会变,所以只有 q [ 1 , n ] q_{[1,n]} q [ 1 , n ] 两两不交才有贡献,那么:
∑ p ∈ P ( n ) ( − 1 ) σ ( p ) ∑ q 1 ∈ { A 1 → B p 1 } ∑ q 2 ∈ { A 2 → B p 2 } ⋯ ∑ q n ∈ { A n → B p n } ∏ i = 1 n w q i = ∑ ( S , p ) ( − 1 ) σ ( p ) ∏ i = 1 ∣ A ∣ w S i \sum\limits_{p\in P(n)}\limits (-1)^{\sigma(p)}\sum\limits_{q_1\in \{A_1\to B_{p_1}\}}\sum\limits_{q_2\in \{A_2\to B_{p_2}\}}\dots \sum\limits_{q_n\in\{A_n\to B_{p_n}\}}\prod\limits_{i=1}^n w_{q_i}=\sum\limits_{(S,p)}(-1)^{\sigma(p)}\prod\limits_{i=1}^{|A|} w_{S_i}
p ∈ P ( n ) ∑ ( − 1 ) σ ( p ) q 1 ∈ { A 1 → B p 1 } ∑ q 2 ∈ { A 2 → B p 2 } ∑ ⋯ q n ∈ { A n → B p n } ∑ i = 1 ∏ n w q i = ( S , p ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ ∣ A ∣ w S i
应用:求不交路径数量
LGV 引理还可以求出从起点集合 A A A 到终点集合 B B B 的不交路径条数,即找到最大的 k k k 使得存在一个路径集合 S S S 满足:
∣ S ∣ = k |S|=k ∣ S ∣ = k ;
S S S 中每条路径的起点都在 A A A 中,终点都在 B B B 中;
S S S 中的路径两两之间没有公共点;
也可以看成将每个点拆成入点和出点之后的最大流。
先来考虑怎么判定其满流,即 ∣ A ∣ = ∣ B ∣ |A|=|B| ∣ A ∣ = ∣ B ∣ 时判断 k = ∣ A ∣ k=|A| k = ∣ A ∣ 。显然这个相当于给每条边权值设为任意正整数后判断 ∑ ( S , p ) ∏ i = 1 ∣ A ∣ w S i \sum\limits_{(S,p)}\prod\limits_{i=1}^{|A|} w_{S_i} ( S , p ) ∑ i = 1 ∏ ∣ A ∣ w S i 是否非 0 0 0 。
但这是积和式,是个 NP 问题。
所以不妨考虑行列式 ∑ ( S , p ) ( − 1 ) σ ( p ) ∏ i = 1 ∣ A ∣ w S i \sum\limits_{(S,p)}(-1)^{\sigma(p)}\prod\limits_{i=1}^{|A|} w_{S_i} ( S , p ) ∑ ( − 1 ) σ ( p ) i = 1 ∏ ∣ A ∣ w S i ,那么此时唯一的问题就是 ( − 1 ) σ ( p ) (-1)^{\sigma(p)} ( − 1 ) σ ( p ) 可能让后面的贡献抵消了。但是由于 Schwartz-Zippel 定理 ,不妨为每条边随机赋一个权值,这样行列式就是 n n n 次多项式(n n n 为 DAG 的点数),故在 mod p \text{mod }p mod p 域下错误率是 n p \frac{n}{p} p n 的,足够小了。
回到原问题,不难发现在随机赋权后就相当于要找到最大的 k k k 使得存在 A A A 的一个 k k k 阶子矩阵满秩。这就相当于求 A A A 的秩,直接线性基即可。
另外,该方法还可以求正常的流量全为 1 1 1 的网络流(不经过重复边),仅需将边拆成点即可。
该方法复杂度是 O ( min ( ∣ A ∣ , ∣ B ∣ ) 2 × max ( ∣ A ∣ , ∣ B ∣ ) ) O(\min(|A|,|B|)^2\times \max(|A|,|B|)) O ( min ( ∣ A ∣ , ∣ B ∣ ) 2 × max ( ∣ A ∣ , ∣ B ∣ ) ) 的,适用于 A A A 和 B B B 中某个集合很小的情况。
例题:
矩阵树定理
对于 n n n 个点的简单无向图 G G G ,设点 i i i 的度数为 d i d_i d i ,设 n × n n\times n n × n 的矩阵 A A A 满足:
A i , j = { d i i = j − 1 i = j , ( i , j ) ∈ G 0 o t h e r w i s e A_{i,j}=\begin{cases}d_i& i=j\\-1&i\not=j,(i,j)\in G\\0&otherwise\end{cases} A i , j = ⎩ ⎪ ⎨ ⎪ ⎧ d i − 1 0 i = j i = j , ( i , j ) ∈ G o t h e r w i s e
设 M i , j M_{i,j} M i , j 为 A A A 删去第 i i i 行第 j j j 列后的 ( n − 1 ) × ( n − 1 ) (n-1)\times (n-1) ( n − 1 ) × ( n − 1 ) 矩阵,则 G G G 的生成树个数等于 ∣ M i , i ∣ |M_{i,i}| ∣ M i , i ∣ ,其中 1 ≤ i ≤ n 1\le i\le n 1 ≤ i ≤ n 。
证明
设 G G G 中有 m m m 条边 ( u i , v i ) (u_i,v_i) ( u i , v i ) ,定义 n × m n\times m n × m 的矩阵 E E E 满足:
∀ 1 ≤ i ≤ m \forall 1\le i\le m ∀ 1 ≤ i ≤ m 都有 E i , u i = 1 , E i , v i = − 1 E_{i,u_i}=1,E_{i,v_i}=-1 E i , u i = 1 , E i , v i = − 1 ;
其它位置 E i , j = 0 E_{i,j}=0 E i , j = 0 ;
u i u_i u i 和 v i v_i v i 的顺序没关系,只要一个位置是 1 1 1 一个位置是 − 1 -1 − 1 就行了。
不难发现 A = E × E T A=E\times E^T A = E × E T ,且设 F i F_i F i 为 E E E 删除第 i i i 行后的矩阵,则 M i , i = F i × F i T M_{i,i}=F_i\times F^T_i M i , i = F i × F i T 。
那么根据 Cauchy-Binet 定理,有:
∣ M i , i ∣ = ∣ F i × F i T ∣ = ∑ S ∈ ( [ m ] n − 1 ) ∣ ( F i ) [ n − 1 ] , S ∣ × ∣ ( F i T ) S , [ n − 1 ] ∣ = ∑ S ∈ ( [ m ] n − 1 ) ∣ ( F i ) [ n − 1 ] , S ∣ × ∣ ( F i ) S , [ n − 1 ] T ∣ = ∑ S ∈ ( [ m ] n − 1 ) ∣ ( F i ) [ n − 1 ] , S ∣ 2 \begin{aligned}
|M_{i,i}|&=|F_i\times F_i^T|\\
&=\sum\limits_{S\in\binom{[m]}{n-1}} |(F_i)_{[n-1],S}|\times |(F^T_i)_{S,[n-1]}|\\
&=\sum\limits_{S\in\binom{[m]}{n-1}} |(F_i)_{[n-1],S}|\times |(F_i)_{S,[n-1]}^T|\\
&=\sum\limits_{S\in\binom{[m]}{n-1}} |(F_i)_{[n-1],S}|^2\\
\end{aligned}
∣ M i , i ∣ = ∣ F i × F i T ∣ = S ∈ ( n − 1 [ m ] ) ∑ ∣ ( F i ) [ n − 1 ] , S ∣ × ∣ ( F i T ) S , [ n − 1 ] ∣ = S ∈ ( n − 1 [ m ] ) ∑ ∣ ( F i ) [ n − 1 ] , S ∣ × ∣ ( F i ) S , [ n − 1 ] T ∣ = S ∈ ( n − 1 [ m ] ) ∑ ∣ ( F i ) [ n − 1 ] , S ∣ 2
注意到,S S S 相当于从 m m m 条边中无序地选取了 n − 1 n-1 n − 1 条,那么仅需证明 S S S 是生成树时 ∣ ( F i ) [ n − 1 ] , S ∣ = ± 1 |(F_i)_{[n-1],S}|=\pm 1 ∣ ( F i ) [ n − 1 ] , S ∣ = ± 1 ,否则 ∣ ( F i ) [ n − 1 ] , S ∣ = 0 |(F_i)_{[n-1],S}|=0 ∣ ( F i ) [ n − 1 ] , S ∣ = 0 即可。
不妨设 Q = F 1 Q=F_1 Q = F 1 ,尝试对 Q Q Q 证明该结论。
不难发现,若 S S S 不是生成树,则其中必定存在环。而对于一个环 C ∈ S C\in S C ∈ S ,C 1 C_1 C 1 对应的列向量一定能被 C > 1 C_{>1} C > 1 对应的列向量依次乘上 1 1 1 或 − 1 -1 − 1 再求和得到(断环为链后只剩下两边的点未被消去),那么 Q [ n − 1 ] , S Q_{[n-1],S} Q [ n − 1 ] , S 不会是满秩矩阵,故其行列式为 0 0 0 。
并且这一条件显然是充要的,因为若没有环则任意一条链两端的点都无法被消去。
接下来证明 ∣ Q ∣ ∈ { − 1 , 0 , 1 } |Q|\in\{-1,0,1\} ∣ Q ∣ ∈ { − 1 , 0 , 1 } 。由于我们不关心它的符号,所以从行列式的定义出发,∣ Q ∣ |Q| ∣ Q ∣ 相当于要给 S S S 中的每条边选择一个端点,将这 n − 1 n-1 n − 1 个端点对应的系数乘起来。
由于第 1 1 1 行已经被删去,所以 u i = 1 u_i=1 u i = 1 的边都只能选 v i v_i v i 。而由于选点不能重复,所以可以以 1 1 1 为根从上至下确定每条边选择的点(儿子),那么选点方案只有一种,故此时 ∣ Q ∣ ∈ { − 1 , 1 } |Q|\in\{-1,1\} ∣ Q ∣ ∈ { − 1 , 1 } 。
那么 Q Q Q 的情况证毕,而对于 F i F_i F i (i = 1 i\not =1 i = 1 )都是等价的,其实只是相当于钦定的根不一样。
拓展形式:
无向带边权 w ( i , j ) w_{(i,j)} w ( i , j ) (计算的是所有生成树边权积的和):
A i , j = { ∑ ( i , v ) ∈ G w ( i , v ) i = j − w ( i , j ) i = j , ( i , j ) ∈ G 0 o t h e r w i s e A_{i,j}=\begin{cases}\sum\limits_{(i,v)\in G} w_{(i,v)}& i=j\\-w_{(i,j)}&i\not=j,(i,j)\in G\\0&otherwise\end{cases} A i , j = ⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ ( i , v ) ∈ G ∑ w ( i , v ) − w ( i , j ) 0 i = j i = j , ( i , j ) ∈ G o t h e r w i s e
证明仅需将 E E E 改为一个 w ( i , j ) \sqrt{w_{(i,j)}} w ( i , j ) ,另一个 − w ( i , j ) -\sqrt{w_{(i,j)}} − w ( i , j ) 即可。
有向带边权:
根向树,根为 r r r :
A i , j = { ∑ i → v ∈ G w i → v i = j − w i → j i = j , i → j ∈ G 0 o t h e r w i s e A_{i,j}=\begin{cases}\sum\limits_{i\to v\in G} w_{i\to v}&i=j\\
-w_{i\to j}&i\not=j,i\to j\in G\\
0&otherwise\end{cases}
A i , j = ⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ i → v ∈ G ∑ w i → v − w i → j 0 i = j i = j , i → j ∈ G o t h e r w i s e
根向树边权积的和为 ∣ M r , r ∣ |M_{r,r}| ∣ M r , r ∣ 。
证明和无向图情况类似,改变一下 E E E 的定义:
( E o u t ) i , j = { w e j e j = i → x 0 o t h e r w i s e (E_{out})_{i,j}=\begin{cases}\sqrt{w_{e_j}}&e_j=i\to x\\0&otherwise\end{cases} ( E o u t ) i , j = { w e j 0 e j = i → x o t h e r w i s e
( E i n ) i , j = { w e j e j = x → i 0 o t h e r w i s e (E_{in})_{i,j}=\begin{cases}\sqrt{w_{e_j}}&e_j=x\to i\\0&otherwise\end{cases} ( E i n ) i , j = { w e j 0 e j = x → i o t h e r w i s e
则有 A = E o u t × ( E o u t − E i n ) T A=E_{out}\times (E_{out}-E_{in})^T A = E o u t × ( E o u t − E i n ) T ,后面的步骤套用无向图情况即可。
叶向树,根为 r r r :
A i , j = { ∑ v → i ∈ G w v → i i = j − w i → j i = j , i → j ∈ G 0 o t h e r w i s e A_{i,j}=\begin{cases}\sum\limits_{v\to i\in G} w_{v\to i}&i=j\\
-w_{i\to j}&i\not=j,i\to j\in G\\
0&otherwise\end{cases}
A i , j = ⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ v → i ∈ G ∑ w v → i − w i → j 0 i = j i = j , i → j ∈ G o t h e r w i s e
叶向树边权积的和为 ∣ M r , r ∣ |M_{r,r}| ∣ M r , r ∣ ,证明和根向树类似。
边权只要在同一个域下就行了,例如可以是多项式。
应用:最小生成树计数
考虑 Kruskal 的过程,每次把边权最小的边加入图中,对每个联通块求出生成树个数,然后将整个连通块缩点即可。
例题:
应用:复杂边权
注意到矩阵树定理做的实际上是:
∑ T [ T is a tree ] ∏ e ∈ T w e \sum\limits_{T}[T\text{ is a tree}]\prod\limits_{e\in T} w_e
T ∑ [ T is a tree ] e ∈ T ∏ w e
那么边权不一定要是数,只要可以在其上定义加法和乘法即可(是个环)。
例如边权可以是多项式、集合幂级数,只需要先做一遍 DFT/FWT 求出点值,再对每个点值分别跑矩阵树,最后合并起来跑 IDFT/IFWT 即可。
例题:
BEST 定理
对于一个存在欧拉回路 的有向图 G G G ,其从 s s s 出发的欧拉回路个数为:
T ( s ) × d s ! × ∏ u = s ( d u − 1 ) ! T(s)\times d_s!\times \prod\limits_{u\not=s} (d_u-1)!
T ( s ) × d s ! × u = s ∏ ( d u − 1 ) !
其中 T ( s ) T(s) T ( s ) 为 G G G 中以 s s s 为根的根向树个数,d u d_u d u 为 u u u 的出度(入度等于出度)。
而 G G G 的所有欧拉回路个数为:
T ( 1 ) × ∏ u ( d u − 1 ) ! T(1)\times \prod\limits_{u}(d_u-1)!
T ( 1 ) × u ∏ ( d u − 1 ) !
证明
先证第一条。
考察除去 s s s 外每个点最后的一条出边,不难发现这些边不可能成环,因为每次进入一个非 s s s 的点后一定要离开它,那么这些边构成了一棵根向树。
由此我们构建了一个从欧拉回路到根向树的映射。
而不难发现,由于欧拉回路存在的充要条件是弱联通且每个点度数为偶数,则除去根向树外,每个点的出边可以任意确定走的次序。这是因为无论怎么走,根向树的树边总是最后一个删掉的,图必定一直弱联通,而度数的条件更不用说了。
对于起点 s s s ,它没有树边,所以所有出边可以以任意次序走,自然没有 − 1 -1 − 1 。
第二条也是同理,先计算出从 1 1 1 出发的欧拉回路个数,而由于 1 1 1 的出度为 d 1 d_1 d 1 ,故其在同一条回路中出现了 d 1 d_1 d 1 次,那么每次出现都可以作为一个起点而将该回路计算一次,故总数需要除掉 d 1 d_1 d 1 。