花了很长时间,终于把差分约束搞清楚了……
当我们在一个图上跑SPFA或DIJKSTRA时,我们能够得到什么?得到的是单源最短(长)路,也就是∀v的min(max){dis[v]-dis[s]},dis[s]是一个全局的“偏移量”,只是通常dis[s]为0而我们未有察觉而已。
考虑为什么跑出来就能得到这样的结果,是因为有一种叫做“松弛操作”的东西。也就是说,如果u到v有一条边其权为w,就可以得到dis[u]+w≤(≥)dis[v],移项得到dis[v]-dis[u]≥(≤)w。因为一条路上一环衔一环,所以联立一条路就能得到dis[v]-dis[s]≥(≤)……。因为路有很多条,再度联立就能得到相应的最值。
后人根据图上如此的性质,发现了差分约束系统。差分是什么?就是我刚才说的“一条路上一环衔一环”。约束是什么?就是构成“每一环”的约束边dis[u]+w≤(≥)dis[v]。在差分约束系统上跑最短(长)路,也就会得到∀v的min(max){dis[v]-dis[s]},这是大多数问题叫我们求的。因为min{x[t]-x[s]}与max{x[s]-x[t]}互为相反数,所以既可以从s开始跑最长路,也可以从t开始跑最短路。
你或许会说,反了反了!但是,事实总是超出我们预料的。就像二分图中,最小边覆盖 = 最大独立集=n-最大匹配。在这里,合法的最小解就是约束图上的最长路,合法的最大解就是约束图上的最短路。
为什么?在这里,依仗“元神”是不行的。因为我们不能这么“唯心”,要用“唯物”的方法动自己的脑子。
最后需要注意的是,DIJKSTRA跑起来会很有问题,因为贪心的基础不存在了。