您的位置:首页 > 其它

差分约束系统

2016-06-22 20:18 281 查看
好吧,其实很好理解

对于一些不等式

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
;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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: