引入

有这样一个问题:

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

(

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. Spark读取elasticsearch数据指南

    最近要在 Spark job 中通过 Spark SQL 的方式读取 Elasticsearch 数据,踩了一些坑,总结于此. 环境说明 Spark job 的编写语言为 Scala,scala-li ...

  2. Python装饰器Decorators

    def hi(name="yasoob"): return "hi " + name print(hi()) # 我们甚至可以将一个函数赋值给一个变量,比如 g ...

  3. 2021.06.12【NOIP提高B组】模拟 总结

    T1 题目大意:有 \(n\) 个点,到点 \(i\) 可以获得 \(A_i\) ,同时消耗 \(B_i\) 若当前价值小于 \(B_i\) 则不能到,问从 \(P\) 开始,任一点结束后的最大值. ...

  4. Linux系列之安装JDK

    卸载open jdk #查看jdk [root@localhost tools]# rpm -qa | grep jdk java-1.8.0-openjdk-headless-1.8.0.65-3. ...

  5. 在Visual C++ 6.0中无法使用gets()函数的解决办法

    问题 昨晚遇到一个有意思的问题,明明在Visual Studio 2019运行好好的C语言代码,Copy到Visual C++ 6.0中就无法编译通过了,错误提示信息如下: error C2143: ...

  6. 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

    Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...

  7. jieba分词原理解析:用户词典如何优先于系统词典

    目标 查看jieba分词组件源码,分析源码各个模块的功能,找到分词模块,实现能自定义分词字典,且优先级大于系统自带的字典等级,以医疗词语邻域词语为例. jieba分词地址:github地址:https ...

  8. Python爬取某短视频热点

    写在前面的一些话: 随着短视频的大火,不仅可以给人们带来娱乐,还有热点新闻时事以及各种知识,刷短视频也逐渐成为了日常生活的一部分.本文以一个简单的小例子,简述如何通过Pyhton依托Selenium来 ...

  9. # vue3 ref 和 reactive 函数

    vue3 ref 和 reactive 函数 前言 上一篇博文介绍 setup 函数的时候,最后出现一个问题,就是在 setup 函数中,编写一个事件,直接去修改定义的变量,发现页面上没有更新成功,并 ...

  10. @PostConstruct +getapplicationcontext.getbean springboot获取getBean

    Componentpublic class SpringContextUtils implements ApplicationContextAware { public static Applicat ...