差分约束算法
[P5960]【模板】差分约束算法
给出一组包含 \(m\) 个不等式,有 \(n\) 个未知数的形如:
\[\begin{cases} x_{c_1}-x_{c'_1}\leq y_1 \\x_{c_2}-x_{c'_2} \leq y_2 \\ \cdots\\ x_{c_m} - x_{c'_m}\leq y_m\end{cases}
\]
的不等式组,求任意一组满足这个不等式组的解。
三角形不等式
最短路松弛边时,都有这样的代码:
if(dis[v]>dis[u]+e[i].dis)
dis[v]=dis[u]+e[i].dis;
松弛后的边即可构成三角形不等式:
\[dis[v] \le dis[u]+e[i].dis
\]
差分约束
对于多个含两个未知量的不等式,可转换成三角形不等式,并向图中加这样一条边,那么对所有不等式都满足即为所有边都是松弛的,可用最短路求解。
1、由于未知源点(或有可能多源点),考虑建超级源点,与所有点连边权为0的边(抽象过来就是取一些未知量为0);
2、有可能要判负环;
P7515 [省选联考 2021 A 卷] 矩阵游戏
,我们可以从中抽象出方程组:
\[\begin{cases} a_{1,1}+a_{1,2}+a_{2,1}+a_{2,2}= b_{1,1} \\ a_{1,2}+a_{1,3}+a_{2,2}+a_{2,3}= b_{1,2}\\ \cdots\\a_{i,j}+a_{i,j+1}+a_{i+1,j}+a_{i+1,j+1}= b_{i,j} \\ \cdots \end{cases}
\]
直接高斯消元肯定不行,题意为构造一组a数组满足条件,考虑差分约束,不过元太多需要变化
在做\(m=2\)时,每行2个数看成一个,仅需枚举第一个;枚举时发现:第一行加一,第二行就减一,第三行就加一……通过这种方法可以从任意一种方案转移至合法方案(如何证明?)
对其进行拓展,发现只要第一行和第一列确定,整个矩阵就确定了,对每一行、每一列都可以有独立的+k、-k、……变换,于是将每行、每列的变换记作\(r_1,r_2,r_3,...,c_1,c_2,c_3,...\),则对于\(a_{i,j}\)的变换\(d_{i,j}\)为\(\pm r_i\pm c_j\)(详情看这里),此时想要\(a_{i,j}\)变换后合法,则有\(-a_{i,j} \le d_{i,j} \le MAXN-a_{i,j}\)
用差分约束求出一组\(r_i,c_i\)即可
p.s. 这说不定是构造题的一个思路

浙公网安备 33010602011771号