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 ...