差分约束
差分约束 如果有这样的条件 x1-x2<=k1 x1-x3<=k2 x2-x3<=k3 转换过来就是 点1到点3最远为k1 其他点同理 那么要求点1到点n的距离 实际就是dis【n]=min(k2,k1+k3) 如果我们把式子1和式子3相加 就能得到x1-x3=k1+k3 那么这个问题就可以转换为最短路的问题: 可以建立一个从点1到点2,点1到点3,点2到点3的一个又向图,然后我们再求其最大或最小距离。 现在看看例题 poj3169 题目大意: 有n个点 其中x条边为点a到点b的距离必选不大于c , 剩下的y条边点a到点b的距离必须不小c,求点1到点n的距离。 思路: 在前x条边中,我们可以等到不等式 xa-xb<=c; 在y条边中,我们得到不等式xa-xb>=c,我们对不等式两边同时乘以-1, 得到xb-xa<=-c,这样保证的了他们的不等于符号方向相同 然后就可应进行最短路的操作了。 代码: #include<string.h> #include<queue> using namespace std; const int maxn=1e4+4; struct node{ int from,to,w,next; }e[200000]; int head[maxn]; int vis[maxn]; int dis[maxn]; int cntt[maxn];