行列式、LGV、矩阵树学习笔记


行列式、LGV、矩阵树学习笔记

前置知识:

行列式

行列式 定义

\[\text{det(A)}=\sum_{p}{(-1)^{\mathrm{sgn}(p)}\prod{A_{i,p_i}}} \]

其中 \(\text{sgn}(p)\) 表示排列 \(p\) 的逆序对个数。

行列式 性质

  • 进行一次矩阵转职,行列式不变。(易证)
  • 行列式任意一行按比例扩大,行列式的值按同样比例扩大。(易证)
  • 行列式中交换任意两行,行列式反号。(易证)
  • 行列式中若有两行成比例,则行列式值为 \(0\)。(通过第二条证明)
  • 行列式中若有一行可以表示为两个数列相加,则行列式为两个行列式的值的和。(证明如下)

\[\text{det}(A)=\sum_p(-1)^{\mathrm{sgn}(p)}\times(B_{k,p_k}+C_{k,p_k})\times \prod_{i=1}^{n~\text{and}~i\not=k}{a_{i,p_i}}=\mathrm{det}(B)+\mathrm{det}(C) \]

行列式 求值

P7112 【模板】行列式求值

根据上面五条性质,可以将矩阵一步步消为左下角全是 \(0\) 的矩阵,类似于高斯消元。最后将矩阵的对角线乘起来即可。

//解法1:类似辗转相除
n=rd(),mod=rd();
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=rd()%mod;
for(int i=1;i<=n;i++)
{
	 for(int j=i+1;j<=n;j++)
	 {
	 	 while(a[j][i])
	 	 {
	 	 	 ll tmp=a[i][i]/a[j][i];
	 	 	 for(int k=i;k<=n;k++)
	 	 	 	 a[i][k]=(a[i][k]-tmp*a[j][k]%mod+mod)%mod;
	 	 	 swap(a[i],a[j]),w=-w;
		 }
	 }
}
for(int i=1;i<=n;i++) ans=ans*a[i][i]%mod;
printf("%lld\n",(mod+w*ans)%mod);
//解法2:高斯消元基本操作
n=rd(),mod=rd();
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=rd()%mod;
for(int i=1;i<=n;i++)
{
     if(a[i][i]==0) for(int j=i+1;j<=n;j++)
           if(a[j][i]) { swap(a[i],a[j]),w=-w; break; }
     for(int j=i+1;j<=n;j++)
     {
          int tmp=a[j][i]/a[i][i];
          for(int k=i;k<=n;k++) a[j][k]=(a[j][k]-tmp*a[i][k]%mod+mod)%mod;
     }
}
for(int i=1;i<=n;i++) ans=ans*a[i][i]%mod;
printf("%lld\n",(ans*w+mod)%mod);

LGV 引理(Lindstrom-Gessel-Viennot lemma)

LGV 引理 内容

  • \(G\) 是一个有限的带权有向无环图。每个顶点的度是有限的,不存在有向环(所以路径数量是有限的)。
  • 起点 \(A=\{a_1,\cdots,a_n\}\),终点 \(B=\{b_1,\cdots,b_n\}\)
  • 每条边 \(e\) 有边权 \(\omega_e\)
  • 对于一个有向路径 \(P\),定义 \(\omega(P)\) 为路径上所有边权的
  • 对任意顶点 \(a,b\),定义 \(e(a,b)=\sum\limits_{P:a \to b}{\omega(P)}\),所有 \(a\)\(b\) 的路径的 \(\omega\) 之和。

设矩阵

\[M={\begin{pmatrix}e(a_{1},b_{1})&e(a_{1},b_{2})&\cdots &e(a_{1},b_{n})\\e (a_{2},b_{1})&e(a_{2},b_{2})&\cdots &e(a_{2},b_{n})\\\vdots &\vdots &\ddots &\vdots \\e(a_{n},b_{1})&e(a_{n},b_{2})&\cdots &e(a_{n},b_{n})\end{pmatrix}} \]

\(A\)\(B\) 的不相交路径组 \(P=(P_1,P_2,\cdots,P_n)\)\(P_i\) 表示从 \(a_i\)\(b_{\sigma(i)}\) 的一条路径,其中 \(\sigma\) 是一个排列(反映了这个排列的映射关系),并且满足对任意 \(i\not=j\)\(P_i\)\(P_j\) 没有公共点。记 \(\sigma(P)\) 表示 \(P\) 对应 \(B\) 的排列。

引理说明,\(M\) 的行列式是所有从 \(A\)\(B\) 的不相交路径 \(P=(P_1,\cdots,P_n)\) 的带符号和。

\[\mathrm{det}(M)=\sum_{P:A\to B}{(-1)^{\mathrm{sgn}(\sigma(P))}\prod_{i=1}^{n}\omega(P_i)} \]

LGV 引理 证明

反证法,即只需证明:(其中 \(P:A\rightarrow B\),存在 \(i\not=j\)\(P_i\)\(P_j\) 有交点)

\[\mathrm{det}(M)=\sum_{P:A\rightarrow B}(-1)^{\mathrm{sgn}(\sigma(P))}\prod_{i=1}^{n}{\omega(P_i)}=0 \]

假设存在一个 \(P\),其中 \(P_i\)\(P_j\) 相交,则 \(a_i\rightarrow b_{\sigma(i)}\)\(a_j\rightarrow b_{\sigma(j)}\) 相交。那么我们将 \(b_{\sigma(i)}\)\(b_{\sigma(j)}\) 互换,最后答案不变而奇偶性相反,一定存在 \(P'=-P\)。因此,如果这一组路径有交点,那么一定被抵消,原命题得证。

LGV 引理 应用

P6657 【模板】LGV 引理

由于在网格上,如果 \(\sigma\not=(1,2,\cdots,n)\),则显然没有解。

因此直接

\[\text{det}(M)=\sum_{P:A\rightarrow B}{1} \]

构造矩阵,\(e(a_i,b_j)=\binom{b_j-a_i+n-1}{n-1}\) 后求行列式即可。

P7736 [NOI2021] 路径交点

乍一眼好像就是 LGV 模型。

就是每一次的 \(\sigma(P)\) 变为了每一层的点对,但是发现最终的排列方式的逆序对数的奇偶性和中间怎样连接没有关系,所以可以直接 \((-1)^{\mathrm{sgn}(\sigma(P)}\),似乎就做完了。

矩阵树定理

矩阵树定理 内容

矩阵树定理用于计算一张图的生成树个数。

定义一张图的拉普拉斯矩阵 \(L\) 是一个 \(n\times n\) 的矩阵,定义如下:

  • \(L_{i,i}\) 为节点 \(i\) 的度数,\(L^{in}_{i,i}\)\(i\) 的出度,\(L^{out}_{i,i}\)\(i\) 的入度。
  • \(L_{i,j}\) 为将 \(i\)\(j\) 直接连向 \(j\) 的边的条数的相反数

若为无向图,这张图的生成树个数就是 \(L\) 去掉一行一列后的行列式。

若为有向图,分为两类:

  • 生成一棵以 \(rt\) 为根且所有边都指向父亲,答案为 \(L^{out}\) 去掉第 \(rt\) 行第 \(rt\) 列后的行列式,记为 \(t^{root}_{rt}\)
  • 生成一棵以 \(rt\) 为根且所有边都指向儿子,答案为 \(L^{in}\) 去掉第 \(rt\) 行第 \(rt\) 列后的行列式,记为 \(t^{leaf}_{rt}\)

常见套路 - 积化和

如果题目中要求的是所有边权之和怎么办?如P6624 [省选联考 2020 A 卷] 作业题,P5296 [北京省选集训2019]生成树计数(暴力多项式加减乘除即可,懒得写了)。

那么运用上多项式的知识!

将每一个数表示为 \(w_ix+1\) 的形式,那么乘起来时候的第 \(x\) 项就是所有的和啦!

记得在多项式高斯消元中选出末尾 \(0(lowdeg)\) 最小的移项和 \(i\) 交换作为除数消去其他的系数。

BEST 定理

\(G\) 为有向图,那么 \(G\) 的不同欧拉回路总数为:

\[t^{root}_{p}\prod_{i=1}^{n}{(\mathrm{deg}(v)-1)} \]

其中 \(p\) 为任意一个点。

证明?就一直咕下去了。。

矩阵树定理 应用

P4111 [HEOI2015]小 Z 的房间

(定理裸的运用)直接套定理即可。

注意:那些不应该在生成树中的点不应该被列入拉普拉斯矩阵。