差分约束

眉间皱痕 提交于 2020-02-02 21:51:39

差分约束

hhh,这几天病毒感染,真的不敢乱溜达,干脆狂写blog算了,hhh

一般形式

差分约束题一般是给出大量的一些不等式
aibixaix+bia_i-b_i\leq x \rightarrow a_i\leq x + b_i
由上面这个不等式我们应该可以联想到最短路的不等式
dis[u]dis[v]+x(uv)dis[u]\leq dis[v] + x(u \rightarrow v)
因此,我们可以将差分约束化成一个最短路来求,我们的dis[u]dis[u]保存由远点到uu的可以选择的最大范围!
为什么是最大范围?
我们每一次选择的是min(uv)min(u \rightarrow v),那么一开始我们就会选择一个从原点ss出发的最小范围,且没有其他路径会使她变得更小(三角形),那么这个由原点出发的长度将会是sus \rightarrow u的范围,选择最大的话,就是这个范围啦。

求最长路

当求最大的范围时是最短路,已经说过了,但是如果求最小范围呢?
看一下基本形式
aibixaix+bia_i-b_i\geq x \rightarrow a_i \geq x + b_i
这个又是什么意思呢?试着把aibia_i,b_i也当作两个点,那么这就是
dis[ai]dis[bi]+xdis[a_i]\geq dis[b_i] + x
也就是最长路的样子啦

最长路

实现最长路的办法,我们试着用最短路的办法去试

  1. floyd O(n3)O(n^3)很明显暴力枚举下面肯定是可以的,但是复杂度实在太高,放弃
  2. dijstra基于贪心的算法,我们最长路的贪心是做不到的,从三角形来看是很明显的,遂继续放弃
  3. bellman_ford差不多就是暴力对所有的边进行n-1次遍历了一条最长路最多经过n1n-1次松弛,在这里最长路也是这样啊,时间复杂度的话,我们可以考虑已经死了的 spfa呀,死了不要紧我们可以优化

spfa玄学优化

  1. 双端队列优化,一个非常常见的优化,当边权小于队首时从队首加入,否则队尾!
  2. 双端慢了?没事我们可以数组模拟,强行加速!
  3. 啊,还是tle?淡定加容错优化,我们首先把所有边权加起来开个根号后加上一个容错值xx然后当当前边权小于队首边权加上容错时从队首加入,否则队尾,继续强行加速!
  4. 听说还是tle?emmm,等死吧
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!