引入

有这样一个问题:

甲和乙在一张网格图上,初始位置

(

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​======​∑σ∈Sn​​sign(σ)∏i=1n​e(ai​,bσ(i)​)∑σ∈Sn​​sign(σ)∏i=1n​∑Pi​:ai​→bσ(i)​​ω(Pi​)∑σ∈Sn​​sign(σ)∑{ω(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→B​sign(σ(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 条路径中,这样的一个逆序代表什么?根据引子里的分析,我们不难发现一个逆序的产生就意味着两条路径相交,那么,根据容斥原理,不难发现上式底下那个大括号框出的式子是等于零的了!

例题

不管在有向无环图中是否可行,反正在网格图中是可行的。

下面看这道例题:

Gym102978A:Ascending Matrix

英文题解:

释疑

虽然都说是有向无环图适用,但是是事实是,我们会找到很多有向无环图,它们计算出的答案并不正确

我们会发现一个规律:这些不适用的有向无环图都是三维图

什么意思呢?也就是我们无法把所有点和边在平面上,使得边之间不交叉

这个定理的证明核心,其实是对于两对点

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 点对不相交路径方案数的更多相关文章

  1. 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程

    转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...

  2. 寻路优化(二)——二维地图上theta*算法的设计探索

    这篇文章是基于上一篇文章的研究上进行的,使得路径更加的平滑和自然,特此记录.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leonhard-/p/68660 ...

  3. 寻路优化(一)——二维地图上A*启发函数的设计探索

    工作中需要优化A*算法,研究了一天,最后取得了不错的效果.看网上的朋友还没有相关的研究,特此记录一下.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leon ...

  4. php背景图片上生成二维码,二维码上带logo 代码示例 (原)

    依赖库文件 phpqrcode.php (下载地址://www.jb51.net/codes/189897.html :或者在官网下载:http://phpqrcode.sourceforge.net ...

  5. 第九章(二)DAG上的动态规划

    DAG上的动态规划: 有向无环图上的动态规划是学习DP的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 1.没有明确固定起点重点的DAG模型: 嵌套矩形问题:有n个矩形,每个矩形可 ...

  6. 51nod-1503 猪和回文 - 二维矩阵上的dp

    题目链接 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表示. 刚开 ...

  7. LGV 引理

    (其实是贺的:https://www.luogu.com.cn/paste/whl2joo4) 目录 LGV 引理 不相交路径计数 例题 Luogu6657. [模板]LGV 引理 CF348D Tu ...

  8. 根据短链生成二维码并上传七牛云(Java)

    通过短链生成二维码并上传七牛云(Java) 前言 网上这种帖子其实也是很多,大部分搜出来的是CSDN的,然后点进去一看都几乎一样:所以这次给个自己实践的例子记录. 这次也是通过搜索得到的一部分能实现这 ...

  9. php 使用phpqrcode生成二维码并上传到OSS

    一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...

随机推荐

  1. 网络协议之:memcached binary protocol详解

    目录 简介 memcached的协议包 memcached命令举例 总结 简介 前面讲到了memcached的文本协议,虽然文本协议看起来非常简单,但是对于客户端来说一般还是会选择效率更高的二进制协议 ...

  2. 并发编程原理学习:synchronized关键字

    概述 关键字synchronized可以修饰方法或者以同步代码块的形式来进行使用,它主要确保多个线程在同一时刻只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性. 同步代码块 ...

  3. rpm构建流程学习总结

    rpm构建流程 学习链接: b站马哥: https://www.bilibili.com/video/BV1ai4y1N7gp RedHat: https://access.redhat.com/do ...

  4. Django从数据库导model迁移乱码

    python manage.py inspectdb > [your app name]\models.py 执行后 model.py乱码,将models.py以 UTF-16LE打开.

  5. MES 系统介绍

    MES系统是一套面向制造企业车间执行层的生产信息化管理系统.MES可以为企业提供包括制造数据管理.计划排程管理.生产调度管理.库存管理.质量管理.人力资源管理.工作中心/设备管理.工具工装管理.采购管 ...

  6. Windows 2008R2 IIS环境配置(靶机)

    一.Windows 2008 R2系统安装 VMware Workstation 15安装包 链接:https://pan.baidu.com/s/11sYcZTYPqIV-pyvzo7pWLQ 提取 ...

  7. 用Python做了个图片识别系统(附源码)

    本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Library)是一种免费的图像 ...

  8. easyexcel注解

    1.@ExcelProperty 必要的一个注解,注解中有三个参数value,index分别代表列明,列序号 1.value 通过标题文本对应2.index 通过文本行号对应 2.@ColumnWit ...

  9. CPI教程-异步接口创建及使用

    CPI教程-异步接口创建及使用 create by yi 转载请注明出处 先简单介绍一下同步接口和异步接口 什么是同步接口 同步接口的意思就是发送方发送Message后,接口方处理完成后会立刻返回执行 ...

  10. CSS 盒子模型(一)

    CSS 盒子模型(一) 本人在校学生,主学后端,后来发现前端的基础都忘得差不多了才想着写文章回来复习!欢迎留言交流. 什么是盒子呢? 拿下举例,我们可以把每个红框都比作一个盒子,他们可以是任意的 HT ...