行列式、LGV、矩阵树学习笔记
前置知识:矩阵、高斯消元
行列式
行列式 定义
其中 表示排列 的逆序对个数。
行列式 性质
- 进行一次矩阵转职,行列式不变。(易证)
- 行列式任意一行按比例扩大,行列式的值按同样比例扩大。(易证)
- 行列式中交换任意两行,行列式反号。(易证)
- 行列式中若有两行成比例,则行列式值为 。(通过第二条证明)
- 行列式中若有一行可以表示为两个数列相加,则行列式为两个行列式的值的和。(证明如下)
行列式 求值
根据上面五条性质,可以将矩阵一步步消为左下角全是 的矩阵,类似于高斯消元。最后将矩阵的对角线乘起来即可。
//解法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 引理 内容
- 是一个有限的带权有向无环图。每个顶点的度是有限的,不存在有向环(所以路径数量是有限的)。
- 起点 ,终点 。
- 每条边 有边权 。
- 对于一个有向路径 ,定义 为路径上所有边权的积。
- 对任意顶点 ,定义 ,所有 到 的路径的 之和。
设矩阵
从 到 的不相交路径组 , 表示从 到 的一条路径,其中 是一个排列(反映了这个排列的映射关系),并且满足对任意 , 与 没有公共点。记 表示 对应 的排列。
引理说明, 的行列式是所有从 到 的不相交路径 的带符号和。
LGV 引理 证明
反证法,即只需证明:(其中 ,存在 , 与 有交点)
假设存在一个 ,其中 与 相交,则 与 相交。那么我们将 与 互换,最后答案不变而奇偶性相反,一定存在 。因此,如果这一组路径有交点,那么一定被抵消,原命题得证。
LGV 引理 应用
P6657 【模板】LGV 引理
由于在网格上,如果 ,则显然没有解。
因此直接
构造矩阵, 后求行列式即可。
P7736 [NOI2021] 路径交点
乍一眼好像就是 LGV 模型。
就是每一次的 变为了每一层的点对,但是发现最终的排列方式的逆序对数的奇偶性和中间怎样连接没有关系,所以可以直接 ,似乎就做完了。
矩阵树定理
矩阵树定理 内容
矩阵树定理用于计算一张图的生成树个数。
定义一张图的拉普拉斯矩阵 是一个 的矩阵,定义如下:
- 为节点 的度数, 为 的出度, 为 的入度。
- 为将 与 直接连向 的边的条数的相反数。
若为无向图,这张图的生成树个数就是 去掉一行一列后的行列式。
若为有向图,分为两类:
- 生成一棵以 为根且所有边都指向父亲,答案为 去掉第 行第 列后的行列式,记为 。
- 生成一棵以 为根且所有边都指向儿子,答案为 去掉第 行第 列后的行列式,记为 。
常见套路
:发现如果有一些神必的数树方案,我们都可以向生成函数方向去思考。
积化和
如果题目中要求的是所有边权之和怎么办?如P6624 [省选联考 2020 A 卷] 作业题,P5296 [北京省选集训2019]生成树计数(暴力多项式加减乘除即可,懒得写了)。
那么运用上多项式的知识!
将每一个数表示为 的形式,那么乘起来时候的第 项就是所有的和啦!
记得在多项式高斯消元中选出末尾 最小的移项和 交换作为除数消去其他的系数。
要求一些边的数量为
设这些边的边权为 ,其他边权为 ,那么我们所有的运算都带上一个 走,变成多项式运算,最后对应系数就是答案。
BEST 定理
设 为有向图,那么 的不同欧拉回路总数为:
其中 为任意一个点。
证明?就一直咕下去了。。
矩阵树定理 应用
-
(定理裸的运用)直接套定理即可。
:那些不应该在生成树中的点不应该被列入拉普拉斯矩阵。
-
(好像并不是单单矩阵树的技巧)如果需要除一个浮点数,但这个数可能为 ,不妨将它赋为 ,这样既对答案没有影响,又防止了
nan
。
本文作者:EricQian's Blog
本文链接:https://www.cnblogs.com/EricQian/p/15915314.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步