根據題意得出約束條件:
s[bi]-s[ai-1] >= ci
變形可得 s[ai-1] -s[bi]<= - ci
這是顯然的。
另外不要忘了對於乙個連續的整數集合,它包含隱性條件
0<=s[i]-s[i-1] <= 1
綜上可得:
①s[ai-1]-s[bi] <= -ci
②s[i]-s[i-1] <= 1
③s[i-1]-s[i] <= 0
最後轉化為最短路問題
/*ctgu_yyf
*/#include#include#include#include#include#include#include#include#include#define inf 999999
#define ll long long
using namespace std;
struct edge;
edge edge[50002];
int dis[50002],ma,mi,n;
void bellman()
//隱性條件判定
for(int i=mi;i<=ma;i++)
if(dis[i]-dis[i-1]>1)
for(int i=ma;i>=mi;i--)
if(dis[i-1]>dis[i])
} }int main()
for(int i=0;i<=ma;i++)
dis[i]=0;
bellman();
cout《第乙個式子在**中化簡得到的是dis[edge[i].t]<=dis[edge[i].s]-edge[i].w
因為要時刻滿足這個條件 所以當他不滿足的時候 需要更新它
用if(dis[edge[i].t]>dis[edge[i].s]-edge[i].w)
來判斷 大於就讓它取等
下面同理。
poj 1201 差分約束
傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...
差分約束(poj 1201
這裡簡要記一下差分約束。所謂差分約束,指的是由a b c這種不等式組組成的約束系統。一般的線性規劃問題可以用單純形法解決,但是這種特殊情況可以借助最短路演算法解決。記源點到v的最短路為d v 從u到v的最短路為d u,v 差分約束的最短路做法基於最短路的以下特點 對於沒有負圈的圖,任意兩點d u d...
POJ1201基礎差分約束
題意 有一條直線,直線上做多有50000個點,然後給你組關係 a b c表明a b之間最少有c個點,問直線上最少多少個點。思路 a b最少有c個點可以想象a到b 1的距離是大於等於c的,還有乙個隱含條件就是 0 s i s i 1 1,差分約束的題目記住找隱含條件很重要,這樣也就是一共三個條件,建邊...