差分约束系统

简单介绍一下差分约束系统:

对于形如

x1-x2<=c1

x1-x3<=c2

x2-x3<=c3

...

构成的不等式组,我们要求出其中的一组解向量(x1,x2,x3,...,xn)使得所有的不等式都成立,我们就可以用最短路算法来解出其中的一个解向量,然后给每个xi同时加上一个常数k,所有不等式仍然成立(两个数同时加上常数k,这两个数的差值不变),然后就求出了解集。

注意到在最短路中d[i]表示i到源点的最短路径长度。那么对于任意一条从u到v的边w(u,v),我们都有d[v]<=d[u]+w(u,v),变形得:

d[v]-d[u]<=w(u,v),这个不等式跟我们上面提到的不等式类似,那么我们就可以把不等式组中的所有未知数都看成一个点,然后建立约束图,这里建图的时候注意x1-x2<c1,我们要建的一条有向边是从x2->x1,然后边权为c1。

最后我们要求最短路了,那么最短路的源点是哪个呢。这里我们要假设一个超级源点x0,然后从超级源点出发到其他所有点都有一条有向边,且边权为0,就是说

x1-x0<=0

x2-x0<=0

...

那么我们就使得解向量的任意一个成员都成了非正数(要知道所有解加上一个常数还是符合条件的)。

然后我们求其他所有点到超级源点的最短路就成了。

特别注意dijkstra是不能处理负边权的图的。

你可能感兴趣的:(差分约束系统)