前置 —— 求解最长路

  1. 将边权取相反数,设此时图为 \(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\) 的最长路。

  2. 实际上,由于最短路有:

    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}\)

差分约束系统

  1. 如果求最大值。

    对于条件 \(x_i-x_j\le k\),建一条从 \(j\)\(i\) 的权值为 \(k\) 的边。求最短路。负环无解。

  2. 如果求最小值。

    对于条件 \(x_i-x_j\le k\),建一条从 \(i\)\(j\) 的权值为 \(-k\) 的边。求最长路。正环无解。

一些题

例 1. \(\text{HDU - 3440 House Man}\)

求最大值,则按小于等于建图求最短路。负环无解。

有两个限制:

  1. 相邻房子距离至少为 \(1\)
  2. 相邻高度房子距离至多为 \(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_{a_i}\ge (k_i-t)\cdot x_{b_i}\text{ and }(k_i+t)\cdot x_{a_i}>x_{b_i} \]

以及一些 \(x_i\) 的值。

求出最大的 \(t\) 使得其无解。


首先想到二分 \(t\),然后判定有无解。可以将连边方式转化为 "乘除" 或 "对数"。

什么样的情况会导致无解呢?以 "对数" 的正负为例(其实 "乘除" 也是一样的,"对数" 的正对应其 \(\ge 1\);反之对应 \(<1\)),假设跑最长路,就是 \(v\ge u+w\),如果最终找到了 环,不等式就无法成立,因为自己无法大于自己。最短路同理。

另外对于一些固定的值可以这样处理:建出虚点 \(0\),"对数" 就赋值为零。连双向边即可。

posted on 2020-09-28 22:13  Oxide  阅读(147)  评论(0编辑  收藏  举报