poj1716 差分約束系統

2021-06-05 16:59:10 字數 1023 閱讀 9903

ceoi的題,很經典!

對於區間問題,思路很多,但如果條件都是關於不等式的,那麼就自然而然的聯想到差分約束系統。

一看到區間,我就會聯想到字首和,而這道題正好用上了。

令sum[i]為從0--i選取到集合的個數的字首和,則有題目條件可得:

對於區間[ai,bi],sum[bi]-sum[ai-1]>=2;

隱含條件:0<=sum[i+1]-sum[i]<=1;(很重要!)

連邊一般有兩種方法,第一種是連邊後求最長路的方法,第二種是連邊後求最短路的方法。 

例:d[x]-d[y]>=z 

如果想連邊後求最長路 那麼將不等式變形為這種形式 d[x]>=d[y]+z y---x

連一條權值為

z的邊 

求最短路則變形成d[y]<=d[x]-z x---y

連一條權值為

-z的邊。 

在差分約束系統中如果題目要求是求最小值,

就將約束條件轉化為

">="形式,

然後用spfa

演算法求解約束圖的最長路徑

,如果題目要求的是最大值

,就將約束條件轉化為

"<="形式,

然後用spfa

演算法求解約束圖的最短路徑

.(為什麼?值得思考,有助於理解)

#include #include using namespace std;

const int maxn=10005,maxm=40005,oo=9999999;

struct edge

e[maxm];

int h[maxn],d[maxn];

bool v[maxn];

int n,m,tot=0;

void ins(int x,int y,int w)

int spfa()

}q.pop();

v[x]=false;

}return d[m];

}

int main()

for (i=0;i

POJ 1716 差分約束

include include include include include include include include using namespace std define print x cout define input x cin x define inf 1 30 define si...

poj1275 差分約束系統

1.思路 沒什麼好講的,劉汝佳的書 演算法藝術與資訊學競賽 講得很好,不過對於初次接觸差分約束系統的人來講還是很費解,可以去參考 演算法導論 裡面有很詳細的約束圖的構建過程。這裡講一下我的個人理解。s i 為從0至i時刻僱傭的人數,t i 為i時刻應聘的人數,r i 為i至 i 1 24時間段需要的...

差分約束系統 POJ 1364

參考 html 所謂查分約束系統其實很簡單,就是全都是兩個未知數的差小於等於某個常數 大於等於 也可以,因為左右乘以 1就可以化成小於等於 的一系列方程組 ax p,a 1或 1 如 x1 x2 0 x1 x5 1 x2 x5 3 x3 x2 5 x4 x3 4 x4 x3 12 x5 x1 23 ...