讲个笑话,NOI 之前某场模拟赛让我知道了这个神奇的科技,于是准备 NOI 之前学完,结果鸽着鸽着就鸽掉了,考 day1 之前一天本来准备花一天时间学的,然后我就开玩笑般地跟自己说,这么 trivial 的东西早学晚学都一样,反正到正式考场上也不大可能派上用场,结果……结果?NOI d1 就考了道这道题,简直笑死我……
引理内容
LGV 引理,全称 Lindstrom-Gessel-Viennot lemma,可以用于求解 DAG 上不相交路径条数,它的内容大致是这样的:
对于一张有向无环图,每条边上都有一个权值 \(w(e)\),我们记 \(weight(P)\) 表示路径 \(P\) 上所有点权值的乘积,那么对于一个起点组成的集合 \(A\) 和终点组成的集合 \(B\),满足 \(|A|=|B|\) 且 \(A\cap B=\varnothing\),我们再记 \(e(i,j)\) 表示所有 \(A_i\to B_j\) 路径的 \(weight\) 之和,那么对于矩阵
\[M=\begin{bmatrix} e(1,1)&e(1,2)&\cdots&e(1,|B|)\\ e(2,1)&e(2,2)&\cdots&e(2,|B|)\\ \vdots&\vdots&\ddots&\vdots\\ e(|A|,1)&e(|A|,2)&\cdots&e(|A|,|B|) \end{bmatrix} \]那么 LGV 的引理的内容可以描述为:
\[\det M=\sum\limits_{p}(-1)^{\tau(p)}C(p) \]其中 \(p\) 为 \(1\sim |A|\) 的排列,\(\tau(p)\) 为 \(p\) 的逆序对数,\(C(p)\) 表示有多少个由 \(|A|\) 条路径组成的 \(|A|\) 元组 \((P_1,P_2,\cdots,P_{|A|})\),满足 \(P_i\) 为 \(A_i\to B_{p_i}\) 的路径,且 \(\forall i,j,P_i\cap P_j=\varnothing\)。
也就是说 \(M\) 的行列式为所有 \(A\) 到 \(B\) 不相交路径的带符号和。
证明
考虑将行列式展开,得到:
\[\begin{aligned} \det M&=\sum\limits_{p}(-1)^{\tau(p)}\prod\limits_{i=1}^{|A|}e(i,p_i) \\&=\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}] \end{aligned} \]记 \(S_1\) 表示所有相交路径组组成的集合,\(S_2\) 表示所有不相交路径组组成的集合,那么上式可进一步写作
\[\det M=\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}][P\in S_1]+\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}][P\in S_2] \]而引理内容等价于:
\[\det M=\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}][P\in S_1] \]因此我们要证明:
\[\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}][P\in S_2]=0 \]我们考虑对于 \(S_2\) 的元素 \(P\) 构造一个双射 \(f:S_2\to S_2\):记 \((i,j)\) 为字典序最小的二元组满足 \(A_i\to B_{p_i}\) 与 \(A_j\to B_{p_j}\) 的路径有交,那么考虑从重合部分结束的位置交换两条路径,如下图所示:
那么得到的新的路径组 \(f(P)=P'\) 显然满足 \(weight(P)=weight(P')\),而 \(P'\) 对应的排列 \(p'\) 相当于在 \(p\) 中交换了 \(p_i\) 和 \(p_j\),根据排列中交换两个元素,逆序对奇偶性改变可知 \((-1)^{\tau(p)}+(-1)^{\tau(p')}=0\),因此有 \((-1)^{\tau(\sigma(P))}weight(P)+(-1)^{\tau(\sigma(f(P)))}weight(f(P))=0\),其中 \(\sigma(P)\) 为 \(P\) 对应的排列,又对于某个相交路径组 \(P\),必定满足 \(f(P)\) 中字典序最小的,满足 \(A_i\to B_{p_i}\cap A_j\to B_{p_j}\ne\varnothing\) 的二元组 \((i,j)\) 与 \(P\) 字典序最小的二元组相同,因此 \(f(f(P))=P\),故 \(f\) 构成一个双射。因此有
\[\begin{aligned} &\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}][P\in S_2] \\=&\dfrac{1}{2}(\sum\limits_{p}(-1)^{\tau(p)}\sum\limits_{P}weight(P)[P_i:A_i\to B_{p_i}][P\in S_2]+\sum\limits_{p}(-1)^{\tau(f(p))}\sum\limits_{P}weight(f(P))[P_i:A_i\to B_{p_i}][P\in S_2]) \\=&\dfrac{1}{2}(\sum\limits_{P\in S_2}(-1)^{\tau(p)}weight(P)+(-1)^{\tau(f(p))}weight(f(P))) \\=&0 \end{aligned} \]证毕。
注意点
注意,在 OI 问题中我们常常遇到这样的问题:给定 \(n\) 个起点 \(a_1,a_2,\cdots,a_n\) 和 \(n\) 个终点 \(b_1,b_2,\cdots,b_n\),问有多少个路径 \(n\) 元组 \((P_1,P_2,\cdots,P_n)\) 满足 \(P_i\) 为 \(a_i\to b_i\) 的路径且它们两两互不相交,此时直接套 LGV 引理是不可以的,因为有可能出现 \(p\ne(1,2,3,\cdots,n)\),却也被统计入答案的情况,不过对于一些特殊的图,譬如网格图,如果我们发现如果 \(p\) 中存在逆序对,就必然会出现两个路径相交,那么就可以直接通过行列式得出答案,否则你行列式算出来值的组合意义是,如果我们把图画在一个平面上并且将起点集合和终点集合从上自下一字排开,\(\det M\) 就是存在偶数个交点的路径组条数减去存在奇数个交点的路径组条数。
例题:
1. P6657 【模板】LGV 引理
显然 \(e(i,j)=e(i,j)=\dbinom{b_j-a_i+n-1}{n-1}\),注意到原图是一个网格图,因此可以直接通过 \(\det M\) 求出答案。高斯消元求一下即可,时间复杂度 \(T(n^3+m)\)
2. P7736 [NOI2021] 路径交点
考虑记 \(A_{i,j}\) 为从第一列第 \(i\) 个点走到第 \(k\) 列第 \(j\) 个点的方案数,那么 \(A_{i,j}\) 显然可以矩阵快速幂求出,那么 \(\det A\) 就是答案。
为什么?考虑 LGV 引理,对于一个排列 \(p\) 对应的一个路径组 \((P_1,P_2,P_3,\cdots,P_{n_1})\),其中 \(P_i\) 为第一列第 \(i\) 个点走到第 \(k\) 列第 \(p_i\) 个点的路径,那么对于排列 \(p\) 中的逆序对 \((i,j)\),必然有 \(|P_i\cap P_j|\) 为奇数,具体证明可以感性地仿照“对于连续函数 \(f\) 的某个区间 \([l,r]\),如果 \(f(l)>0,f(r)<0\),且 \(f\) 在 \([l,r]\) 上零点个数有限,那么 \([l,r]\) 中零点个数必为奇数”,同理对于排列 \(p\) 中的逆序对 \((i,j)\),必然有 \(|P_i\cap P_j|\) 为偶数,因此 \((P_1,P_2,P_3,\cdots,P_{n_1})\) 交点个数的奇偶性与 \(\tau(p)\) 的奇偶性相同,对答案的贡献也相同。
时间复杂度 \(\mathcal O(n^4)\)。
3. CF348D Turtles
题目等价于,有多少条路径对 \((P_1,P_2)\) 满足 \(P_1\) 为从 \((1,2)\to(n-1,m)\) 的路径,\(P_2\) 为从 \((2,1)\to(n,m-1)\) 的路径,且 \(P_1\cap P_2=\varnothing\),由于是网格图,所以直接上个 LGV 引理,然后对 \(2\times 2\) 的矩形进行高斯消元求行列式即可。