简单介绍一下差分约束系统:
对于形如
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是不能处理负边权的图的。