Hoping for the best but expecting|

EricQian06

园龄:4年6个月粉丝:24关注:43

2022-02-20 13:10阅读: 217评论: 0推荐: 2

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

前置知识:矩阵、高斯消元

行列式

行列式 定义

det(A)=p(1)sgn(p)Ai,pi

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

行列式 性质

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

det(A)=p(1)sgn(p)×(Bk,pk+Ck,pk)×i=1n and ikai,pi=det(B)+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:高斯消元基本操作
inline double det()
{
	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={a1,,an},终点 B={b1,,bn}
  • 每条边 e 有边权 ωe
  • 对于一个有向路径 P,定义 ω(P) 为路径上所有边权的
  • 对任意顶点 a,b,定义 e(a,b)=P:abω(P),所有 ab 的路径的 ω 之和。

设矩阵

M=(e(a1,b1)e(a1,b2)e(a1,bn)e(a2,b1)e(a2,b2)e(a2,bn)e(an,b1)e(an,b2)e(an,bn))

AB 的不相交路径组 P=(P1,P2,,Pn)Pi 表示从 aibσ(i) 的一条路径,其中 σ 是一个排列(反映了这个排列的映射关系),并且满足对任意 ijPiPj 没有公共点。记 σ(P) 表示 P 对应 B 的排列。

引理说明,M 的行列式是所有从 AB 的不相交路径 P=(P1,,Pn) 的带符号和。

det(M)=P:AB(1)sgn(σ(P))i=1nω(Pi)

LGV 引理 证明

反证法,即只需证明:(其中 P:AB,存在 ijPiPj 有交点)

det(M)=P:AB(1)sgn(σ(P))i=1nω(Pi)=0

假设存在一个 P,其中 PiPj 相交,则 aibσ(i)ajbσ(j) 相交。那么我们将 bσ(i)bσ(j) 互换,最后答案不变而奇偶性相反,一定存在 P=P。因此,如果这一组路径有交点,那么一定被抵消,原命题得证。

LGV 引理 应用

P6657 【模板】LGV 引理

由于在网格上,如果 σ(1,2,,n),则显然没有解。

因此直接

det(M)=P:AB1

构造矩阵,e(ai,bj)=(bjai+n1n1) 后求行列式即可。

P7736 [NOI2021] 路径交点

乍一眼好像就是 LGV 模型。

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

矩阵树定理

矩阵树定理 内容

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

定义一张图的拉普拉斯矩阵 L 是一个 n×n 的矩阵,定义如下:

  • Li,i 为节点 i 的度数,Li,iini 的出度,Li,iouti 的入度。
  • Li,j 为将 ij 直接连向 j 的边的条数的相反数

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

若为有向图,分为两类:

  • 生成一棵以 rt 为根且所有边都指向父亲,答案为 Lout 去掉第 rt 行第 rt 列后的行列式,记为 trtroot
  • 生成一棵以 rt 为根且所有边都指向儿子,答案为 Lin 去掉第 rt 行第 rt 列后的行列式,记为 trtleaf

常见套路

Trick:发现如果有一些神必的数树方案,我们都可以向生成函数方向去思考。

积化和

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

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

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

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

要求一些边的数量为 x

设这些边的边权为 x,其他边权为 1,那么我们所有的运算都带上一个 x 走,变成多项式运算,最后对应系数就是答案。

BEST 定理

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

tprooti=1n(deg(v)1)

其中 p 为任意一个点。

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

矩阵树定理 应用

  • P4111 [HEOI2015]小 Z 的房间

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

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

  • P3317 [SDOI2014]重建

    (好像并不是单单矩阵树的技巧)如果需要除一个浮点数,但这个数可能为 0,不妨将它赋为 eps,这样既对答案没有影响,又防止了 nan

本文作者:EricQian's Blog

本文链接:https://www.cnblogs.com/EricQian/p/15915314.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   EricQian06  阅读(217)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起