好吧,其实很好理解
对于一些不等式
s[x1]-s[y1]>=a1
s[x2]-s[y2]>=a2
……
它们的解是什么呢?
首先可以将每个y向x连边
那么
从y能够更新走到x的最短路必须满足
s[x]>s[y]+a
移项
s[x]−s[y]>a
你发现了什么?
又变回了不等式!!
这就是差分约束系统
对于整个不等式组的解就是从1到n的最短路
当然,在某些题目中也有可能是求最长路
用一个spfa就行了
在一些题目中稍加转化,注意好隐含条件,就可以用差分约束搞定
int i=0,j=1,bz[N];dd[1]=0;
memset(s,128,sizeof(s));s[0]=0;memset(bz,0,sizeof(bz));bz[0]=1;
for(;i<j;)
{
int x=dd[++i];
for(int k=last[x];k;k=next[k])
{
if (s[to[k]]<s[x]+data[k])
{
s[to[k]]=s[x]+data[k];
if (bz[to[k]]==0)
{
dd[++j]=to[k];bz[to[k]]=1;
}
}
}
bz[x]=0;
}