前些日子,看了下这个差分约束系统,今天刷了几道题目,就稍微总结下。
有x1,x2,x3.....xn这些未知量,出现一系列xi-xj<=k(k是常量,题目给出)的不等式,问这些等式有没有解,或者求xn-x1的最大值(最小值)。就可以向差分约束系统方面考虑。
附注:有时候是给出xi-xj>=k,那就转化成xj-xi<=-k。有时候给xi-xj=k,那就转成xi-xj>=k并且xi-xj<=k。有时候给xi-xj<k,因为处理不了这种没有等于的,如果是整数就转成xi-xj<=k-1,反正就是要令所有的不等式统一符号(就是全部大于等于或者全部小于等于)。
第一种:如何判断这些等式是否有解,把所有不等式转换成xi-xj<=k的形式后,对每个xi-xj<=K,点j向点i连一条边权为k的边(单向边),建立图后,看情况考虑要不要设立一个源点s,让点s连向其他所有的点(单向边),边权0,对点s跑一次spfa,看看是否会出现负环(如何利用spfa判负环参考大白书)。出现负环无解,否则有解。想想看,其实出现负环就相当把几个等式相加,然后出现了0<=负数的情况。
有一个序列S={a1,a2,a3,....,am},现在给出一些不等式
使得ai+a(i+1)+a(i+2)+.......+a(i+ni)>ki或者ai+a(i+1)+a(i+2)+.......+a(i+ni)<k。(注意这里是从ai本身开始后面再加ni个数),让你判断是否所有的不等式都满足条件,满足就输出 lamentable kingdom,不满足就输出successful conspiracy。
ai+a(i+1)+a(i+2)+.......+a(i+ni)>ki转换成ai+a(i+1)+a(i+2)+.......+a(i+ni)>=ki+1转换成sum[i+ni]-sum[i-1]>=ki+1转换成sum[i-1]-sum[i+ni]<=-1-ki
ai+a(i+1)+a(i+2)+.......+a(i+ni)<ki转换成ai+a(i+1)+a(i+2)+.......+a(i+ni)<=ki-1转换成sum[i+ni]-sum[i-1]<=ki-1
然后像上面我说的那样建立图,然后spfa跑看看是否出现负环,是的话就无解,否则有解。
POJ3159