Lindström–Gessel–Viennot引理及其应用
给定有向无环图(Directed Acyclic Graph, DAG)G=(V,E),以及源点集S={s1,s2,…,sn},汇点集T={t1,t2,…,tn}。每一条边(x,y)都有一个权值w(x,y)。我们定义一条路径π:x0→x1→⋯→xk的权值为:
w(π)=k∏i=1w(xi−1,xi).
对任意两个节点x,y∈V,定义
e(x,y)=∑π:x→yw(π),
其中,π:x→y表示一条从x出发,到达y的路径π。特别地,如果对所有边(x,y),都有w(x,y)≡1,则e(x,y)为x到y的所有路径的数量。
我们记路径n元组(π1,π2,…,πn):S→T表示n条从S中节点出发,到达T中节点的不相交路径,其中对所有i∈[n],πi从si出发,并且对任意两条路径πi和πj (i≠j),他们都不经过相同节点(包括路径的两个端点)。对于一个这样的路径n元组,存在一个置换σ(π1,π2,…,πn):[n]→[n],使得第i条路径πi从si出发,到达tσ(i)。
Lindström–Gessel–Viennot引理:
|e(s1,t1)e(s1,t2)…e(s1,tn)e(s2,t1)e(s2,t2)…e(s2,tn)⋮⋮⋱⋮e(sn,t1)e(sn,t2)…e(sn,tn)|=∑(π1,π2,…,πn):S→Tsign(σ(π1,π2,…,πn))n∏i=1w(πi),
其中sign(σ)表示置换σ的奇偶性,偶置换为1,奇置换为−1。
特别地,如果对所有边(x,y),都有w(x,y)≡1,并且置换只能是恒等置换(即σ(i)=i)时才存在不相交的路径n元组,则所求行列式即为不相交的路径n元组的数量。
例题1
有m个起点si=(ai,1),以及对应的m个终点ti=(bi,n),满足1≤a1≤a2≤⋯≤am≤n且1≤b1≤b2≤⋯≤bm≤n。每一步可以从(x,y)走到(x+1,y)或者(x,y+1)。求两两不相交的路径m元组的数量。1≤n≤106,1≤m≤100。
解法:我们注意到只有恒等置换对应的路径才可能不相交。因此,Lindström–Gessel–Viennot引理所求的行列式即为答案。其中,
e(s_i, t_j) = \begin{cases} \binom{b_j-a_i+n-1}{b_j-a_i} & b_j \geq a_i, & \\ 0 & \text{otherwise}. \end{cases}
时间复杂度为O(n+m^3)。
例题2
有n个起点s_i = (0, a_i),以及对应的n个终点t_i = (i, 0),其中1 \leq i \leq n,满足0 \leq a_1 < a_2 < \dots < a_n \leq 10^6。每一步可以从(x, y)走到(x+1,y)或者(x,y-1)。求两两不相交的路径n元组的数量。1 \leq n \leq 5 \cdot 10^5。
解法:思路同例题1。但最后列出的行列式是n \times n阶的矩阵,直接O(n^3)Gauss消元是不能接受的。注意到,
e(s_i, t_j) = \binom{a_i+j}{j} = \frac{(a_i+j)!}{j!a_i!}.
所求行列式可化为
\begin{aligned} \left| \begin{matrix} e(s_1, t_1) & e(s_1, t_2) & \dots & e(s_1, t_n) \\ e(s_2, t_1) & e(s_2, t_2) & \dots & e(s_2, t_n) \\ \vdots & \vdots & \ddots & \vdots \\ e(s_n, t_1) & e(s_n, t_2) & \dots & e(s_n, t_n) \end{matrix} \right| & = \left| \begin{matrix} \frac{(a_1+1)!}{1!a_1!} & \frac{(a_1+2)!}{2!a_1!} & \dots & \frac{(a_1+n)!}{n!a_1!} \\ \frac{(a_2+1)!}{1!a_2!} & \frac{(a_2+2)!}{2!a_2!} & \dots & \frac{(a_2+n)!}{n!a_2!} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{(a_n+1)!}{1!a_n!} & \frac{(a_n+2)!}{2!a_n!} & \dots & \frac{(a_n+n)!}{n!a_n!} \end{matrix} \right| = \left(\prod_{i=1}^n \frac{(a_i+1)!}{ i! a_i! }\right) \left| \begin{matrix} 1 & a_1+2 & \dots & (a_1+2) \dots (a_1+n) \\ 1 & a_2+2 & \dots & (a_2+2) \dots (a_2+n) \\ \vdots & \vdots & \ddots & \vdots \\ 1 & a_n+2 & \dots & (a_n+2) \dots (a_n+n) \\ \end{matrix} \right| \\ & = \left(\prod_{i=1}^n \frac{a_i+1}{i!}\right) \left| \begin{matrix} 1 & a_1 & \dots & a_1^{n-1} \\ 1 & a_2 & \dots & a_2^{n-1} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & a_n & \dots & a_n^{n-1} \\ \end{matrix} \right| = \left(\prod_{i=1}^n \frac{a_i+1}{i!}\right) \left( \prod_{1 \leq i < j \leq n} (a_i-a_j) \right) \end{aligned}
提出系数之后,可化为一个Vandermonde行列式,而最后我们要求a_i两两之差之积。我们注意到0 \leq a_i \leq 10^6 =: W,从而-10^6 \leq a_i-a_j \leq 10^6,因此可以考虑使用FFT优化卷积O(W \log W)统计不同可能的差的数量即可。
例题3
CodeForces 167E. Wizards and Bets
给定n个节点,m条边的有向无环图G = (V, E),其有恰好k个无入边以及k个无出边的点,按照他们的编号从小到大排序后依次为s_1, s_2, \dots, s_k以及t_1, t_2, \dots, t_k。求【对应置换是偶置换的路径k元组的数量】与【对应置换是奇置换的路径k元组的数量】之差。n \leq 600, m \leq 10^5。
解法:令每条边的权值w(x, y) = 1,则Lindström–Gessel–Viennot引理所求的行列式即为答案。所有的e(s_i, t_j)(即从s_i走到t_j的路径的数量)可以在O(nm)的时间内求出。于是总的时间复杂度为O(n^3+nm)。
例题4
给定一个k层的有向无环图,其中第i(1 \leq i \leq k)层有n_i个节点,且n_1 = n_k。从第i层走向第i+1层的边(x_1, y_1)与(x_2, y_2) (x_1 \neq x_2, y_1 \neq y_2)存在一个交点,当且仅当(x_1-x_2)(y_1-y_2) < 0。一个从第1层节点走向第k层节点的(不在顶点相交的)路径n_1元组的交点个数为其中任意两条路径的交点个数之和。求【交点个数为偶数的路径n_1元组的数量】与【交点个数为奇数的路径n_1元组的数量】之差。k \leq 100, n_i \leq 200。
解法:注意到【交点个数为偶数的路径n_1元组】即为【对应置换是偶置换的路径n_1元组】。问题直接化为例题3。时间复杂度为O(k n^3),其中n = \max\{n_1,n_2,\dots,n_k\}。
例题5
AtCoder Beginner Contest 216 H. Random Robots
给定k个起点(0, x_1), (0, x_2), \dots, (0, x_k),满足0 \leq x_1 < x_2 < \dots < x_k \leq 1000。每一步可以从(x, y)走到(x+1,y)或者(x+1,y+1)。求终点在(n, y_i)的所有不相交的路径k元组的数量。1 \leq k \leq 10, 1 \leq n \leq 1000。
解法:
根据Lindström–Gessel–Viennot引理,我们枚举所有可能的终点,记x_i = (0, x_i)以及y_i = (n, y_i),将其求和得
\sum_{0 \leq y_1 < y_2 < \dots < y_k \leq x_k+n} \left| \begin{matrix} e(x_1, y_1) & e(x_1, y_2) & \dots & e(x_1, y_n) \\ e(x_2, y_1) & e(x_2, y_2) & \dots & e(x_2, y_n) \\ \vdots & \vdots & \ddots & \vdots \\ e(x_n, y_1) & e(x_n, y_2) & \dots & e(x_n, y_n) \end{matrix} \right|.
其中,e(x_i, y_j) = \begin{cases} \binom{n}{y_j-x_i} & 0 \leq y_j-x_i \leq n \\ 0 & \text{otherwise} \end{cases}。
令S = \{s_1, s_2, \dots, s_{|S|}\} \subseteq [k],b为终点y_i的上界,定义
f(S, b) = \sum_{0 \leq y_1 < y_2 < \dots < y_{|S|} \leq b} \left| \begin{matrix} e(x_{s_1}, y_1) & e(x_{s_1}, y_2) & \dots & e(x_{s_1}, y_{|S|}) \\ e(x_{s_2}, y_1) & e(x_{s_2}, y_2) & \dots & e(x_{s_2}, y_{|S|}) \\ \vdots & \vdots & \ddots & \vdots \\ e(x_{s_{|S|}}, y_1) & e(x_{s_{|S|}}, y_2) & \dots & e(x_{s_{|S|}}, y_{|S|}) \end{matrix} \right|.
于是所求为f([k], x_k + n)。
我们可以考虑f(S, b)可以从哪些状态推得。
1. y_{|S|} < b,此时来自的状态是f(S, b-1)。
2. y_{|S|} = b,此时所求为
\sum_{0 \leq y_1 < y_2 < \dots < y_{|S|-1} < y_{|S|} = b} \left| \begin{matrix} e(x_{s_1}, y_1) & e(x_{s_1}, y_2) & \dots & e(x_{s_1}, y_{|S|}) \\ e(x_{s_2}, y_1) & e(x_{s_2}, y_2) & \dots & e(x_{s_2}, y_{|S|}) \\ \vdots & \vdots & \ddots & \vdots \\ e(x_{s_{|S|}}, y_1) & e(x_{s_{|S|}}, y_2) & \dots & e(x_{s_{|S|}}, y_{|S|}) \end{matrix} \right| = \sum_{i=1}^{|S|} (-1)^{|S|+i} e(x_{s_i}, y_{|S|}) \left| \begin{matrix} e(x_{s_1}, y_1) & e(x_{s_1}, y_2) & \dots & e(x_{s_1}, y_{|S|-1}) \\ \vdots & \vdots & \cdots & \vdots \\ e(x_{s_{i-1}}, y_1) & e(x_{s_{i-1}}, y_2) & \dots & e(x_{s_{i-1}}, y_{|S|-1}) \\ e(x_{s_{i+1}}, y_1) & e(x_{s_{i+1}}, y_2) & \dots & e(x_{s_{i+1}}, y_{|S|-1}) \\ \vdots & \vdots & \cdots & \vdots \\ e(x_{s_{|S|}}, y_1) & e(x_{s_{|S|}}, y_2) & \dots & e(x_{s_{|S|}}, y_{|S|-1}) \end{matrix} \right| = \sum_{i=1}^{|S|} (-1)^{|S|+i} e(x_{s_i}, y_{|S|}) f(S\setminus\{s_i\}, b-1).
综上,动态规划方程为
f(S, b) = f(S, b-1) + \sum_{i=1}^{|S|} (-1)^{|S|+i} e(x_{s_i}, b) f(S\setminus\{s_i\}, b-1).
边界条件为f(S, -\infty) = [S = \emptyset]。
时间复杂度为O(k2^k(n+x_k))。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-09-03 CodeForces 1396E. Distance Matching