POJ 1201 差分約束求最短路

2021-08-22 06:08:16 字數 948 閱讀 8220

根據題意得出約束條件:

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,差分約束的題目記住找隱含條件很重要,這樣也就是一共三個條件,建邊...