概念: 差分約束系統是特殊的n元一次不等式組,它包含n
nn個變數,x1−
xn
x_1 - x_n
x1−xn
以及m
mm個約束條件,每乙個約束條件由兩個變數作差構成的,類似於xi−
xj≤a
kx_i-x_j \leq a_k
xi−xj
≤ak
,需要解決的問題是找到一組解,使得給出的約束條件得到滿足。
如何解決差分約束系統 ->最短路演算法
現在已知
b −a
≤c
b - a \leq c
b−a≤cc−b
≤a
c - b \leq a
c−b≤ac−a
≤b
c - a \leq b
c−a≤
b如果現在要求c−a
c-ac−
a的最大值,那麼可以知道 max
(c−a
)=mi
n(b,
a+c)
max(c-a) = min(b,a+c)
max(c−
a)=m
in(b
,a+c
)現在我們將圖建出來,how to build?
差分約束建圖技巧
1.對於乙個全部都是≤
\leq
≤的不等式組,我們可以把式子轉化為xi≤
xj+w
(i,j
)x_i \leq x_j+w(i,j)
xi≤xj
+w(
i,j)
,即i ,j
i,ji,
j建邊,xj−
>xi
=w(i
,j
)x_j->x_i=w(i,j)
xj−
>xi
=w(
i,j)
,用最短路演算法解決問題,求得最小值
2.對於乙個全部都是≥
\geq
≥號的不等式組,我們可以將每個式子轉化為xi≥
xj+w
(i,j
)x_i \geq x_j+w(i,j)
xi≥xj
+w(
i,j)
,即i,
ji,j
i,j建邊,xj−
>xi
=w(i
,j
)x_j->x_i=w(i,j)
xj−
>xi
=w(
i,j)
,用最長路演算法解決,求得最大值
如果dis[xi]為inf或-inf,那麼xi為任意解
如果求最短路的過程**現負環,那麼說明該不等式組無解
harbin ccpc a
#include
using namespace std;
const
int maxn =
2e4+5;
const
int inf =
0x3f3f3f3f
;int n,m1,m2;
struct edgeedge[maxn<<2]
;int head[maxn]
,tot;
inline
void
addedge
(int u,
int v,
int w)
; head[u]
= tot;
}int s;
bool vis[maxn]
;struct intervalintval[maxn]
;int dis[maxn]
,in[maxn]
;inline
void
buildgraph
(int mid)
addedge(0
,n,mid)
;addedge
(n,0
,-mid)
;for
(int i =
0; i < m1+m2;
++i)
else}}
inline bool spfa
(int s)};
priority_queue pq;
pq.push
(node);
while
(!pq.
empty()
)); in[e.v]++;
if(in[e.v]
>n)
return false;
vis[e.v]
= true;}}
}}return true;
}int
main()
;}for(
int i = m1; i < m1+m2;
++i);}
int ans =0;
int l =
0,r = n;
while
(l <= r)
else l = mid +1;
}printf
("%d\n"
,ans);}
return0;
}
差分約束系統
差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...
差分約束系統
差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...
差分約束系統
差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...