LGV 引理
(其实是贺的:https://www.luogu.com.cn/paste/whl2joo4)
LGV 引理
LGV 引理,即 Lindström–Gessel–Viennot lemma .
一个带权 DAG \(G\) 中有起点集 \(A=\{a_1, a_2, \cdots, a_n\}\),终点集 \(B=\{b_1, b_2, \cdots, b_n\}\) .
不相交路径定义为:一组 \(u\to v\) 的不相交路径 \(P=(P_1,P_2,\cdots,P_n)\),满足 \(P_i\) 是一条 \(a_i\) 到 \(b_{\sigma(P)_i}\) 的路径,其中 \(\sigma(P)\) 是 \(P\) 对应的排列 .
且对于任意 \(i\neq j\),\(P_i, P_j\) 无公共点(即不相交)令 \(\omega(P)\) 为路径 \(P\) 上所有边权的积 .
对顶点 \(u,v\),定义
\[e(u,v) = \sum_{P:a \to b}{\omega(P)}
\]令 \(\tau(p)\) 表示排列 \(p\) 的逆序对个数 .
令矩阵
\[M=\begin{bmatrix}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{bmatrix}
\]则有
\[\boxed{\det(M)=\sum_{P:A\to B}{(-1)^{\tau(P)}\prod_{i=1}^{n}\omega(P_i)}}
\]
证明:
展开行列式的定义,得 LGV 引理等价于
\]
其中 \(p\) 是一个 \(1\) 到 \(n\) 的排列 .
妈呀左右两边长得这么像!
观察组合意义!我们可以发现:
- LHS 其实就是选 \(n\) 条起点和终点分别互不相同的路径,然后把他们的带符号和加起来 .
- RHS 几乎一样,只不过 \(\displaystyle \sum_p\) 变成了 \(\displaystyle \sum_{P:A\to B}\),也就是要求路径不相交 .
故我们考虑构造双射 .
如果两个人的路径相交了,我们可以将相交后的部分取反,就相当于这两人分别走到了对方的终点去 . 这样是不是就不交了!!
是不是很平凡! 证明真牛逼 orz .
AJH 大佬说边权只要是交换环就行,也就是说可以是 GF .
太强了 orz
不相交路径计数
LGV 引理的直接应用 .
有一个图 \(G\) 是 平面图 且是 DAG .
从每个 \(a_i\) 到 \(b_i\),在满足路径不交的前提下,所有方案中路径边权乘积之和 .
是不是就是板子啊 .
你用一种方法算出 \(e\),然后是不是构造出 \(M\) 高斯消元求行列式就完了 .
为什么要是平面图?
一般的 LGV 题符合要求的匹配只有一组(e.g. 网格图),因此按照匹配的顺序列矩阵求出的就是不交路径数量 .
然而如果不是平面图,直接求 \(\det(M)\) 其实并不一定是不交路径数量 .
具体可以看 NOI2021 路径交点 .
例题
Luogu6657. 【模板】LGV 引理
link: https://www.luogu.com.cn/problem/P6657
一个 \(n\times n\),每步只能往右下走 .
\(m\) 个棋子,初始在 \((a_i,1)\),要到 \((b_i,n)\) .
求不交路径方案数,对 \(998244353\) 取模 .
不相交路径计数 弱化版 .
显然对于任何一个路径,\(\omega(P)=1\),这样我们才能计数嘛 .
因为是网格图,所以拿出我们老生常谈的网格图两点路径计数:
\]
(因为从 \((x_1,y_1)\) 到 \((x_2,y_2)\) 的方案数是 \(\dbinom{x_2-x_1+y_2-y_1}{x_2-x_1}\))
然后预处理阶乘及其逆元算 binom,然后高斯消元求行列式就完了 .
时间复杂度 \(O(n+m^3)\) .
CF348D Turtle
link: https://codeforces.com/contest/348/problem/D
网格图去掉一些点,两个点从 \((1,1)\) 走到 \((n,m)\),求不交路径数取模 \(10^9+7\) .
大力 LGV 引理 .
把两个相同起始点拆开,起点拆成 \((1,2)\),\((2,1)\),终点拆成 \((n-1,m)\),\((n,m-1)\) .
然后 LGV 引理可得一个二阶行列式,对角线法则乘开即可 .
然后变成带限制路径计数,做四边 DP 即可 .
时间复杂度 \(O(nm)\) .
Monotonic Matrix
link: https://www.nowcoder.com/acm/contest/139/A
求满足以下条件 \(n\times m\) 矩阵的数量:
- \(A_{i,j}\in\{0, 1, 2\}\) .
- \(A_{i,j}\le A_{i,j+1}\),\(A_{i,j}\le A_{i+1,j}\) .
对 \(10^9+7\) 取模 .
从起点 \((0,0)\) 终点 \((n,m)\) 画一条非降路径,然后 \(0,1\) 是沿着网格走的过程 .
从起点 \((-1,1)\) 终点 \((n-1,m+1)\) 画一条非降路径,然后 \(1,2\) 是沿着网格走的过程 .
然后用 LGV 引理算出不交的路径的方案数即可 .
然而这玩意也是二阶行列式,就是几个组合数乘一下减一下 .
时间复杂度在于求组合数 .
习题
Reference
- 【题解】洛谷 P6657 【模板】LGV 引理 - wsyhb
- 浅谈LGV引理 - TheLostWeak
- LGV 引理 - OI Wiki
- NOI 2021 D1T2 题解 - ix35
- [整理]LGV 引理 - ajthreac
- LGV 引理——二维DAG上 n 点对不相交路径方案数 - DD(XYX)
- 2018牛客多校第一场 Monotonic Matrix (LGV引理)
LGV 引理的更多相关文章
- 2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11260/C 题目大意 一个平面上,\(n\)个起点\((0,a_i)\)分别对应终点\((i,0)\),每次 ...
- P7736-[NOI2021]路径交点【LGV引理】
正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有\(k\)层的图,第\(i\)层有\(n_i\)个点,每层的点从上到下排列,层从左到右排列.再 ...
- LGV 引理小记
讲个笑话,NOI 之前某场模拟赛让我知道了这个神奇的科技,于是准备 NOI 之前学完,结果鸽着鸽着就鸽掉了,考 day1 之前一天本来准备花一天时间学的,然后我就开玩笑般地跟自己说,这么 trivia ...
- LGV 引理——二维DAG上 n 点对不相交路径方案数
文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...
- P6657-[模板]LGV 引理
正题 题目链接:https://www.luogu.com.cn/problem/P6657 题目大意 给出$n\times n$的棋盘,$m$个起点第$i$个为$(1,a_i)$,对应$m$个终点第 ...
- ZROI 暑期高端峰会 A班 Day1 组合计数
AGC036F Square Constriants 一定有 \(l_i<p_i\le r_i\). 考虑朴素容斥,枚举每个数是 \(\le l_i\) 还是 \(\le r_i\).对于 \( ...
- ACM模板_axiomofchoice
目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...
- 【置顶】Trotyl's OI tree
\(\rm thx\):@\(\rm UntilMadow\) ! \(\color{Green}{\rm Pupil}\) :只会一点点 \(\color{blue}{\text{Expert}}\ ...
- NOI2021游记
NOI2021游记 前言 写于 2021.7.28,成绩榜刚出后几个小时.总分 345 拿到银牌 183 名. 我的高中 OI 生活在这里画上句号.结局对我而言虽然不够完美,但是无论怎样都是我人生道路 ...
随机推荐
- C++面向对象-类和对象那些你不知道的细节原理
一.类和对象.this指针 OOP语言的四大特征是什么? 抽象 封装.隐藏 继承 多态 类体内实现的方法会自动处理为inline函数. 类对象的内存大小之和成员变量有关 类在内存上需要对齐,是为了减轻 ...
- DEDECMS登录后台,无法连接数据库的原因
在CMS的网页模块中,当迁移网站出现后台无法登录的时候 最可能的情况有下列几种: 1. 数据库服务器宕机.如果是云上的数据库时,需要联系客服进行解决.是有自己的搭建的数据库,需要查看服务是否正常启动 ...
- python目录索引
python目录索引 python基础数据类型1 目录 part1 part2 运算符 格式化 part3 字符串 字符串常用操作方法 part4 列表 列表的创建: 列表的索引,切片 列表的增删改查 ...
- [KDTree]数列
NKOJ传送门 describtion 给你一个序列,每个序列有编号(它本身的位置),标识符,数值. 有4种操作 op=0:l,r,x,y将编号在[l,r]的数值x+y op=1:l,r,x,y将标识 ...
- React简单教程-6-单元测试
前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...
- JAVA - 如何判断一个类是无用的类
JAVA - 如何判断一个类是无用的类 方法区主要回收的是无用的类,那么如何判断一个类是无用的类的呢? 判定一个常量是否是"废弃常量"比较简单,而要判定一个类是否是"无用 ...
- python求最大公约数和最小公倍数
1 def gcd(x,y): 2 while(y): 3 t=x%y 4 x=y 5 y=t 6 #print("最小公倍数是:",x*y/x)#最小公倍数是两数之积除以最大公约 ...
- 一张图进阶 RocketMQ - NameServer
前言 「三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦.」 一张图进阶 RocketMQ 图 ...
- RocketMQ事务消息机制
1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...
- zabbix监控apache80端口
1.修改zabbix_agentd.conf 修改# EnableRemoteCommands=0 -->去掉注释修改为1--> EnableRemoteCommands=1 ###允许客 ...