前置 —— 求解最长路
-
将边权取相反数,设此时图为 \(G'\)。若 \(G'\) 无负权环(即 \(G\) 无正权环),则有 \(d'[v]\le len'[v]\),其中 \(d'[v]\) 为在图 \(G'\) 上求得的最短路,\(len'[v]\) 为源点到 \(v\) 的任意路径权值和。同时可得 \(-d'[v]\ge len[v]\),所以可以得到 \(D[v]=-d'[v]\),其中 \(D[v]\) 为原图源点到 \(v\) 的最长路。
-
实际上,由于最短路有:
if(d'[v]>d'[u]+w'(u,v)) d'[v]=d'[u]+w'(u,v)
我们可以将其改写为:
if(D[v]<D[u]+w(u,v)) D[v]=D[u]+w(u,v)
不过,由此看出若 \(G\) 有正边,相当于 \(G'\) 有负边,而 \(G'\) 的最短路等价于 \(G\) 的最长路,此时不能用 \(\mathtt{Dijkstra}\),只能用 \(\mathtt{SPFA}\)。
差分约束系统
-
如果求最大值。
对于条件 \(x_i-x_j\le k\),建一条从 \(j\) 到 \(i\) 的权值为 \(k\) 的边。求最短路。负环无解。
-
如果求最小值。
对于条件 \(x_i-x_j\le k\),建一条从 \(i\) 到 \(j\) 的权值为 \(-k\) 的边。求最长路。正环无解。
一些题
例 1.
\(\text{HDU - 3440 House Man}\)
求最大值,则按小于等于建图求最短路。负环无解。
有两个限制:
- 相邻房子距离至少为 \(1\)。
- 相邻高度房子距离至多为 \(D\)。
最后需要注意,查询时应查询编号小的房子到编号大的房子的距离,如果反过来查根据我们的建图得到的值应该是负值。
例 2.
\(\text{CF1450E Capitalism}\)
求最大值,则建图求最短路。负环无解,这是由于求最短路实际上是卡着限制跑,如果这样自己都要仰慕自己,就无解了。
对于限制 \(|a_i-a_j|=1\),可以拆成 \(|a_i-a_j|\le 1\) 且 \(|a_i-a_j|\ge 1\)。
继续拆成四个条件:\(a_i\le a_j+1\) 或 \(a_i\ge a_j-1\),\(a_j\le a_i-1\) 或 \(a_j\ge a_i+1\)。
显然,我们不能从前一对与后一对的限制中分别选一个,组合来搞,这样的边数组合是指数级的。不妨先选择最弱的一组条件:\(a_i\le a_j+1,a_j\le a_i+1\),其实也就是保证 \(|a_i-a_j|\le 1\)。现在我们惊喜地发现,不合法的情况其实也就是 \(i\rightarrow j\) 的边权为零!
那么考虑什么情况下必须填零。考虑如果不是环,那么一定可以填 \(1\)。这样问题就简单了:由于合法边权为 \(1\),那么只有偶环有解,奇环一定会出现零边!
用 \(\mathtt{Floyd}\) 找出最大值,并查集维护二分图即可。
\(\sf P.S.\) 之前自己没搞懂,今天回来又看了一遍终于想明白了!
例 3.
倍杀测量者
题意描述:给出一系列不等式
以及一些 \(x_i\) 的值。
求出最大的 \(t\) 使得其无解。
首先想到二分 \(t\),然后判定有无解。可以将连边方式转化为 "乘除" 或 "对数"。
什么样的情况会导致无解呢?以 "对数" 的正负为例(其实 "乘除" 也是一样的,"对数" 的正对应其 \(\ge 1\);反之对应 \(<1\)),假设跑最长路,就是 \(v\ge u+w\),如果最终找到了 正 环,不等式就无法成立,因为自己无法大于自己。最短路同理。
另外对于一些固定的值可以这样处理:建出虚点 \(0\),"对数" 就赋值为零。连双向边即可。