這裡簡要記一下差分約束。
所謂差分約束,指的是由a-b>=c這種不等式組組成的約束系統。一般的線性規劃問題可以用單純形法解決,但是這種特殊情況可以借助最短路演算法解決。
記源點到v的最短路為d[v],從u到v的最短路為d(u,v)。差分約束的最短路做法基於最短路的以下特點:
對於沒有負圈的圖,任意兩點d[u]+d(u,v)>=d[v],實際上相當於一條從u到v的長度為d的邊(模擬求最短路的過程,可以知道的d[v]的最終值是(d[u]+d(u,v))的最小值)。
對於約束條件都轉化成以上形式連邊之後,所求得的d[t]-d[s]也就是d[t]其實就是原約束條件下d[t]-d[s]的最大值。(因為各路徑的約束條件中取等號即最短路時差取最大值d(u,v))
對於求最小值的情況,需要轉化成d[u]+d(u,v)<=d[v]這樣的形式,然後連邊求最長路,與最短路時對稱。
1201**:
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back
#define fs first
#define se second
using
namespace
std;
typedef
long
long
ll;typedef pair
p;const
int maxv=5e4+400
;struct
ees[maxv*4
];int h=0
;e *g[maxv];
e *tail[maxv];
void add(int
from,int to,int
w)int
n;int
dis[maxv];
int s=maxv,t=0
;bool
vis[maxv];
queue
q;void bf(int
s) }}}
cout
}int
main()
for(int i=0;i)
for(int i=0;i1;i++)
bf(s);
return0;
}
ps:這題卡vector鄰接表。。。。
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 ...
POJ1201基礎差分約束
題意 有一條直線,直線上做多有50000個點,然後給你組關係 a b c表明a b之間最少有c個點,問直線上最少多少個點。思路 a b最少有c個點可以想象a到b 1的距離是大於等於c的,還有乙個隱含條件就是 0 s i s i 1 1,差分約束的題目記住找隱含條件很重要,這樣也就是一共三個條件,建邊...
POJ 1201 差分約束系統
差分約束系統其實就是將不等式組的求解問題轉化為最短路進行求解,所以屬於圖論。但往往抽象出不等式組是不容易的。差分約束系統入門可看這位大佬的博文 夜深人靜寫演算法 四 本題大意 n個區間,輸入n行ai,bi,ci,代表在區間 ai,bi 上至少要選擇ci個整數點,可以在區間內任意取ci個不重複的點。求...