首页 > 代码库 > 差分约束系统

差分约束系统

差分约束系统就是给出一些形如x-y<=b不等式的约束,问你是否有满足问题的解,或者求最小,最大解。

(以下(a,b,c)表示从a向b连一条权值为c的边

一.原理

对于图论的最短路径,有:d(v) <= d(u) + w(u, v) ,而差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。

移项得:d(v) - d(u) <= w(u, v),是不是和上面的x-y<=b的一样?

二.建图

分两种情况讨论

(1)题目要求最大解

我们把题目给出的不等式转化成x-y<=b的形式,把d设成无穷大,连一条(y,x,b)的边,使用最短路

为什么? 

d[]一开始为无穷大,图最短路更新的条件为: if(d[v]>d[u]+w(u,v))   d[v]=d[u]+w(u,v);

通过不断的松弛,使得d的值不断变小,直到满足所有条件时,就是最大的了

(2)题目要求最小解

我们把题目给出的不等式转化成x-y>=b的形式,把d设成无穷小,连一条(y,x,b)的边,使用最长路

三.技巧与注意

1.转化不等式

(1)a==b    =>     a>=b  ,   a<=b   

(2)a-b<c (a,b为整数)  =>     a-b<=c-1

(3)a-b>c (a,b为整数)  =>     a-b>=c+1

2.注意不连通的图

3.注意判负环(最短路),正环(最长路)

在SPFA中,如果一个点入队超过n(点的个数)次,那么该图存在负(正)环

差分约束系统