LGV 引理——二维DAG上 n 点对不相交路径方案数
引入
有这样一个问题:
甲和乙在一张网格图上,初始位置
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
(x_1,y_1),(x_2,y_2)
(x1,y1),(x2,y2) ,分别要走到
(
x
3
,
y
3
)
,
(
x
4
,
y
4
)
(x_3,y_3),(x_4,y_4)
(x3,y3),(x4,y4),每次只能水平向右或竖直向下走 1 格,问两个人安排路径使之不相交的方案数。
这个问题我们可以用稍微复杂的容斥做,也可以用类似卡塔兰数两个组合数相减公式的推导方法,我们会发现
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1) 到
(
x
4
,
y
4
)
(x_4,y_4)
(x4,y4) 的路径数乘上
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2) 到
(
x
3
,
y
3
)
(x_3,y_3)
(x3,y3) 的路径数刚好就是路径相交,也就是不合法的方案数,因为这两条路径一定交叉了嘛,所以等价于在第一个交叉位置上甲乙身份互换了,然后跑到对方终点的方案,这和相交的方案数是相等的。
因此答案就为
c
n
t
(
x
1
,
y
1
)
→
(
x
3
,
y
3
)
∗
c
n
t
(
x
2
,
y
2
)
→
(
x
4
,
y
4
)
−
c
n
t
(
x
1
,
y
1
)
→
(
x
4
,
y
4
)
∗
c
n
t
(
x
2
,
y
2
)
→
(
x
3
,
y
3
)
cnt_{(x_1,y_1)\rightarrow(x_3,y_3)}*cnt_{(x_2,y_2)\rightarrow(x_4,y_4)}-cnt_{(x_1,y_1)\rightarrow(x_4,y_4)}*cnt_{(x_2,y_2)\rightarrow(x_3,y_3)}
cnt(x1,y1)→(x3,y3)∗cnt(x2,y2)→(x4,y4)−cnt(x1,y1)→(x4,y4)∗cnt(x2,y2)→(x3,y3)
那么如果甲乙丙丁戊己庚辛壬癸……多达上百人要分别从一个位置到另一个位置,要求路径都不相交呢?
那就只能用
L
G
V
\rm LGV
LGV 引理 了。
简介
L
i
n
d
s
t
r
o
¨
m
–
G
e
s
s
e
l
–
V
i
e
n
n
o
t
l
e
m
m
a
\rm Lindström–Gessel–Viennot\;lemma
Lindstro¨m–Gessel–Viennotlemma,即
L
G
V
\rm LGV
LGV 引理,可以用来处理有向无环图(不准确,看下面的释疑)上不相交路径计数等问题。(有向无环图真的可行吗?)
前置知识:图、行列式。
定义
摘自OI Wiki.
ω
(
P
)
\omega(P)
ω(P) 表示
P
P
P 这条路径上所有边的边权之积。(路径计数时,可以将边权都设为
1
1
1)(事实上,边权可以为生成函数)
e
(
u
,
v
)
e(u,v)
e(u,v) 表示
u
u
u 到
v
v
v 的 每一条 路径 P 的
ω
(
P
)
\omega(P)
ω(P) 之和,即
e
(
u
,
v
)
=
∑
P
:
u
→
v
ω
(
P
)
e(u,v)=\sum_{P:u\rightarrow v}\omega(P)
e(u,v)=∑P:u→vω(P) 。
起点集合
A
A
A,是有向无环图点集的一个子集,大小为
n
n
n。
终点集合
B
B
B,也是有向无环图点集的一个子集,大小也为
n
n
n。
一组
A
→
B
A\rightarrow B
A→B 的不相交路径
S
S
S:
S
i
S_i
Si 是一条从
A
i
A_i
Ai 到
B
σ
(
S
)
i
B_{σ(S)_i}
Bσ(S)i 的路径(
σ
(
S
)
σ(S)
σ(S) 是一个排列),对于任何
i
≠
j
i\not= j
i=j,
S
i
S_i
Si 和
S
j
S_j
Sj 没有公共顶点。
N
(
σ
)
N(σ)
N(σ) 表示排列
σ
σ
σ 的逆序对个数。
引理
∑
S
:
A
→
B
(
−
1
)
N
(
σ
(
S
)
)
∏
i
=
1
n
ω
(
S
i
)
=
∣
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
)
∣
\sum_{S:A\rightarrow B}(-1)^{N(σ(S))}\prod_{i=1}^{n}\omega(S_i)= \begin{vmatrix} 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)\\ \cdots&\cdots&\ddots&\cdots\\ e(A_n,B_1)&e(A_n,B_2)&\cdots&e(A_n,B_n)\\ \end{vmatrix}
S:A→B∑(−1)N(σ(S))i=1∏nω(Si)=∣∣∣∣∣∣∣∣e(A1,B1)e(A2,B1)⋯e(An,B1)e(A1,B2)e(A2,B2)⋯e(An,B2)⋯⋯⋱⋯e(A1,Bn)e(A2,Bn)⋯e(An,Bn)∣∣∣∣∣∣∣∣
等式左边即为我们要求的方案数,OI Wiki:
∑
S
:
A
→
B
\sum_{S:A\rightarrow B}
∑S:A→B 为上文提到的每一组不相交路径
S
S
S.
可以发现,我们如果用高斯消元求行列式的值,解决这个问题的时间复杂度是
O
(
n
3
)
O(n^3)
O(n3) 的。
证明
参考维基百科(需要梯子)
翻译一下核心证明公式:(好像不是很核心)
det
M
=
∑
σ
∈
S
n
s
i
g
n
(
σ
)
∏
i
=
1
n
e
(
a
i
,
b
σ
(
i
)
)
=
∑
σ
∈
S
n
s
i
g
n
(
σ
)
∏
i
=
1
n
∑
P
i
:
a
i
→
b
σ
(
i
)
ω
(
P
i
)
=
∑
σ
∈
S
n
s
i
g
n
(
σ
)
∑
{
ω
(
P
)
:
P
从
(
a
1
,
a
2
,
…
,
a
n
)
到
(
b
σ
(
1
)
,
b
σ
(
2
)
,
…
,
b
σ
(
n
)
)
的
n
条
路
径
}
=
∑
{
s
i
g
n
(
σ
(
P
)
)
ω
(
P
)
:
P
扭曲的从
(
a
1
,
a
2
,
…
,
a
n
)
到
(
b
1
,
b
2
,
.
.
.
,
b
n
)
的
n
条路径
}
=
∑
{
s
i
g
n
(
σ
(
P
)
)
ω
(
P
)
:
P
扭曲的从
(
a
1
,
a
2
,
…
,
a
n
)
到
(
b
1
,
b
2
,
.
.
.
,
b
n
)
的
n
条 不相交 路径
}
+
∑
{
s
i
g
n
(
σ
(
P
)
)
ω
(
P
)
:
P
扭曲的从
(
a
1
,
a
2
,
…
,
a
n
)
到
(
b
1
,
b
2
,
.
.
.
,
b
n
)
的
n
条 存在相交 的路径
}
=
∑
(
P
1
,
…
,
P
n
)
:
A
→
B
s
i
g
n
(
σ
(
P
)
)
ω
(
P
)
+
∑
{
s
i
g
n
(
σ
(
P
)
)
ω
(
P
)
:
P
扭曲的从
(
a
1
,
a
2
,
…
,
a
n
)
到
(
b
1
,
b
2
,
.
.
.
,
b
n
)
的
n
条 存在相交 的路径
}
⏟
=
0
?
{\displaystyle {\begin{array}{rcl}\det M&=&\sum _{\sigma \in S_{n}}\mathrm {sign} (\sigma )\prod _{i=1}^{n}e(a_{i},b_{\sigma (i)})\\&=&\sum _{\sigma \in S_{n}}\mathrm {sign} (\sigma )\prod _{i=1}^{n}\sum _{P_{i}:a_{i}\to b_{\sigma (i)}}\omega (P_{i})\\&=&\sum _{\sigma \in S_{n}}\mathrm {sign} (\sigma )\sum \{\omega (P):P~{\text从}~\left(a_{1},a_{2},\ldots ,a_{n}\right)~{\text{到}}~\left(b_{\sigma (1)},b_{\sigma (2)},\ldots ,b_{\sigma (n)}\right)~{\text的}~n~{\text条路径}\}\\&=&\sum \{\mathrm {sign} (\sigma (P))\omega (P):P~{\text{扭曲的从}}~\left(a_{1},a_{2},\ldots ,a_{n}\right)~{\text{到}}~\left(b_{1},b_{2},...,b_{n}\right)~{\text{的}}~n~{\text{条路径}}\}\\&=&\sum \{\mathrm {sign} (\sigma (P))\omega (P):P~{\text{扭曲的从}}~\left(a_{1},a_{2},\ldots ,a_{n}\right)~{\text{到}}~\left(b_{1},b_{2},...,b_{n}\right)~{\text{的}}~n~{\text{条 不相交 路径}}\}\\&&+\sum \{\mathrm {sign} (\sigma (P))\omega (P):P~{\text{扭曲的从}}~\left(a_{1},a_{2},\ldots ,a_{n}\right)~{\text{到}}~\left(b_{1},b_{2},...,b_{n}\right)~{\text{的}}~n~{\text{条 存在相交 的路径}}\}\\&=&\sum _{(P_{1},\ldots ,P_{n})\colon A\to B}\mathrm {sign} (\sigma (P))\omega (P)\\&&+\underbrace {\sum \{\mathrm {sign} (\sigma (P))\omega (P):P~{\text{扭曲的从}}~\left(a_{1},a_{2},\ldots ,a_{n}\right)~{\text{到}}~\left(b_{1},b_{2},...,b_{n}\right)~{\text{的}}~n~{\text{条 存在相交 的路径}}\}} _{=0?}\\\end{array}}}
detM======∑σ∈Snsign(σ)∏i=1ne(ai,bσ(i))∑σ∈Snsign(σ)∏i=1n∑Pi:ai→bσ(i)ω(Pi)∑σ∈Snsign(σ)∑{ω(P):P 从 (a1,a2,…,an) 到 (bσ(1),bσ(2),…,bσ(n)) 的 n 条路径}∑{sign(σ(P))ω(P):P 扭曲的从 (a1,a2,…,an) 到 (b1,b2,...,bn) 的 n 条路径}∑{sign(σ(P))ω(P):P 扭曲的从 (a1,a2,…,an) 到 (b1,b2,...,bn) 的 n 条 不相交 路径}+∑{sign(σ(P))ω(P):P 扭曲的从 (a1,a2,…,an) 到 (b1,b2,...,bn) 的 n 条 存在相交 的路径}∑(P1,…,Pn):A→Bsign(σ(P))ω(P)+=0?
∑{sign(σ(P))ω(P):P 扭曲的从 (a1,a2,…,an) 到 (b1,b2,...,bn) 的 n 条 存在相交 的路径}
第一行是行列式的展开式,后面相当于把每种排列都枚举出来,“扭曲的(直译)”表示
a
i
a_i
ai 不一定对应
b
i
b_i
bi,其中的
s
i
g
n
(
σ
(
P
)
)
{\rm sign}(σ(P))
sign(σ(P)) 表示
(
−
1
)
排列 σ(P) 的逆序数
(-1)^{\text{排列 σ(P) 的逆序数}}
(−1)排列 σ(P) 的逆序数 。
那么,在
(
a
1
,
a
2
,
…
,
a
n
)
\left(a_{1},a_{2},\ldots ,a_{n}\right)
(a1,a2,…,an) 到
(
b
σ
(
P
)
1
,
b
σ
(
P
)
2
,
…
,
b
σ
(
P
)
n
)
\left(b_{σ(P)_1},b_{σ(P)_2},\ldots,b_{σ(P)_n}\right)
(bσ(P)1,bσ(P)2,…,bσ(P)n) 的
n
n
n 条路径中,这样的一个逆序代表什么?根据引子里的分析,我们不难发现一个逆序的产生就意味着两条路径相交,那么,根据容斥原理,不难发现上式底下那个大括号框出的式子是等于零的了!
例题
不管在有向无环图中是否可行,反正在网格图中是可行的。
下面看这道例题:
英文题解:
释疑
虽然都说是有向无环图适用,但是是事实是,我们会找到很多有向无环图,它们计算出的答案并不正确。
我们会发现一个规律:这些不适用的有向无环图都是三维图。
什么意思呢?也就是我们无法把所有点和边画在平面上,使得边之间不交叉。
这个定理的证明核心,其实是对于两对点
a
→
b
,
c
→
d
a\rightarrow b\;,\;c\rightarrow d
a→b,c→d ,交换
c
c
c 和
d
d
d 后不存在方案合法。如果是三维图的话,它们可以绕过去,像一上一下的立交桥一样。
而二维图就适用了,因为它和网格图性质是一样的。
扩展
如果真的是个三维图,那么求出来的是什么呢?
我们还是把整个图拍扁,把两条边交叉定义为在二维面上有交点。
永远的神 S
Y
\rm SY
SY 给出了答案:那就是【路径点不相交、边交叉对数为偶数的方案数】 减去 【路径点不相交、边交叉对数为奇数的方案数】。
刚好在 【NOI2021 D1T2 路径交点】 中被考到 (〒_〒)。
LGV 引理——二维DAG上 n 点对不相交路径方案数的更多相关文章
- 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程
转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...
- 寻路优化(二)——二维地图上theta*算法的设计探索
这篇文章是基于上一篇文章的研究上进行的,使得路径更加的平滑和自然,特此记录.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leonhard-/p/68660 ...
- 寻路优化(一)——二维地图上A*启发函数的设计探索
工作中需要优化A*算法,研究了一天,最后取得了不错的效果.看网上的朋友还没有相关的研究,特此记录一下.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leon ...
- php背景图片上生成二维码,二维码上带logo 代码示例 (原)
依赖库文件 phpqrcode.php (下载地址://www.jb51.net/codes/189897.html :或者在官网下载:http://phpqrcode.sourceforge.net ...
- 第九章(二)DAG上的动态规划
DAG上的动态规划: 有向无环图上的动态规划是学习DP的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 1.没有明确固定起点重点的DAG模型: 嵌套矩形问题:有n个矩形,每个矩形可 ...
- 51nod-1503 猪和回文 - 二维矩阵上的dp
题目链接 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表示. 刚开 ...
- LGV 引理
(其实是贺的:https://www.luogu.com.cn/paste/whl2joo4) 目录 LGV 引理 不相交路径计数 例题 Luogu6657. [模板]LGV 引理 CF348D Tu ...
- 根据短链生成二维码并上传七牛云(Java)
通过短链生成二维码并上传七牛云(Java) 前言 网上这种帖子其实也是很多,大部分搜出来的是CSDN的,然后点进去一看都几乎一样:所以这次给个自己实践的例子记录. 这次也是通过搜索得到的一部分能实现这 ...
- php 使用phpqrcode生成二维码并上传到OSS
一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...
随机推荐
- Redis配置登录密码
更新记录 2022年6月14日 发布. 打开配置文件 vi /etc/redis/redis.conf 搜索来找到下面这行注释 #requirepass foobared 取消注释,把 foobare ...
- 【Srping】事务的执行原理(一)
在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,那么就从@EnableTransactionManagement入手查看一下事务的执行原理. @Enab ...
- 一条 SQL 语句是如何执行的
一条 SQL 语句是如何执行的 SQL查询语句 select * from user where ID=10; MySQL 的基本架构可以分为 Server 层和存储引擎两部分.Server 层又包含 ...
- rhel安装程序
Linux下软件分类 rpm软件包,包管理器 yum deb软件包,包管理器 apt 源代码软件包 一般为".tar.gz".&quo ...
- bat-命令行配置静态IP地址
查看连接名称ipconfig 打开命令提示符,输入netsh后回车 输入interface后回车 输入ip,回车 输入set address "连接名称" static 新IP地址 ...
- SQL优化常用的几种方法
为什么要对SQL优化: 1.执行性能低 2.等待时间过长 3.SQL写的太差 4.索引失效 ·····等等 SQL优化的一些方法: 1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看S ...
- Kalman卡尔曼滤波,Least Square最小二乘估计,加权最小二乘,递归最小二乘
以下是Kalman的收敛性证明思路: cite:Stochastic Processes and Filtering Theory
- SpringBoot自定义starter开发分布式任务调度实践
概述 需求 在前面的博客<Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战>中,我们已经熟悉ElasticJob分布式任务的应用,其核心实现为elasticjob- ...
- springboot集成redis集群
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- 边缘计算 KubeEdge+EdgeMash
简介 KubeEdge是面向边缘计算场景.专为边云协同设计的业界首个云原生边缘计算框架,在 Kubernetes 原生的容器编排调度能力之上实现了边云之间的应用协同.资源协同.数据协同和设备协同等能力 ...