差分约束系统个人理解
今天接触到一种很玄幻的东西:
差分约束
个人的理解:差分约束就是给定一些限制条件,求出满足条件的最优解,或者判断条件是否成立
做法/思路:
1.首先根据题目的条件,写出相应的不等式
2.将不等式转换成a-b<=c的形式
3.建一条权值为c的边,从b指向a
4.从0点向其他点连一条边权为1的点
5.跑深搜的SPFA,看看答案是否更新
这样做完,求得的是最短路!得出的是满足条件的最大值!
当然,你也可以按照和上面完全相反的思路做,
那么做法和得到的结果都是和上述完全相反的,但是都可以AC!
这里面肯定是有很多疑点的,我来根据的我理解解释一下
1.为什么要建一条从b到a的边权为c的边
因为a-b<=c,所以b到a的边权最大就是c,那么得到的答案也是最大
2.为什跑的是最短路不是最长路
因为我们每次建的都是最大的边权,而我们要求出满足所有的不等式的值。
那么当这个值是所有不等式中的最小的值得时候方能满足条件,
所以我们要求最短路
3.为什么SPFA要跑深搜而不是广搜
因为深搜容易判断负环!
4.为什么要建一条从0到所有的点的边
个人感觉:为了方便更新答案,因为0在所有边中都没有出现过
推荐几篇比较好的文章:
http://972169909-qq-com.iteye.com/blog/1185527
http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。