差分约束(1)

一开始我对“差分约束”的概念不是很懂,后面在刷题的过程中渐渐明白:”差分约束“的本质就是将一个不等式转换成一个图,再来计算对应的最短路或最长路。

如图为一个基础的原图模型:

(这里拿了“英雄哪里出来”的图片和部分文字出来说明,如果原作者有所不满,请联系我进行删减)

不等式分别为:

x1-x0<=2;

x2-x0<=7;

x3-x0<=8;

x2-x1<=3;

x3-x2<=2;

其实这些不等式看上去可能会有些陌生,但是会写SPFA的人马上就会发现这些不等式很像下面的代码的变形:

if(w[p]+a[i].s<w[a[i].to])
{
   w[a[i].to]=w[p]+a[i].s;
}

变形为:w[a[i].to]-w[p]=a[i].s;(最后会得到一个w[a[i].to]的最小值,使得w[a[i].to]-w[p]<=a[i].s)

于是就可以通过这种方式根据每个不等式都做每一条路,从而求出最小路得到原题目的答案。

可能有人会问:那这条路的起点,终点又是什么呢?

根据上面插入的代码来看,明显是根据p的点来确定a[i].to的位置,所以p是起点,a[i].to是终点,边权自然是a[i].s了。

即:减号后面的是起点,减号前面的是终点。

还有最长路,其实和最短路是一样的,只不过把大小等于号换了一下而已,代码实现也差不多。。。

具体参考:解释更专业化的大佬博客

猜你喜欢

转载自www.cnblogs.com/manmanjiangQwQ/p/9103111.html