差分約束系統

2021-10-16 03:37:16 字數 2564 閱讀 4391

一、定義

如果乙個系統由n個變數和m個約束條件組成,形成m個形如ai-aj≤k的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。

觀察xj-xi<=bk,會發現它類似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]<=w[u,v] [1] 。因此,以每個變數xi為結點,對於約束條件xj-xi<=bk,連線一條邊(i,j),邊權為bk。我們再增加乙個源點s,s與所有定點相連,邊權均為0。對這個圖,以s為源點執行bellman-ford演算法(或spfa演算法),最終即為一組可行解。

二、實現

求解差分約束系統,可以轉化成圖論的單源最短路徑(或最長路徑)問題。

並且,在實際應用中,多使用spfa演算法實現。

那麼如果在乙個未知數定死的情況下,要求其它所有未知數的最小值怎麼辦?只要反過來求最長路徑就可以了。最長路徑中的三角不等式與最短路徑中相反:

d(v) >= d(u) + w(u, v)

也就是 d(v) - d(u) >= w(u, v)

所以建圖的時候要先把所有不等式化成大於等於號的。其它各種過程,包括證明為什麼解出的是最小值的證法,都完全類似。

三、應用

總之對於不同的題目,給出的條件都不一樣,我們首先需要關注問題是什麼,

①求 xn-x1 的最大值:

將所有不等式化為 a-b<=w 的形式,對每個不等式建邊:b 到 a 權值為 w

②求 xn-x1 的最小值

將所有不等式化為 a-b>=w 的形式,對每個不等式建邊:b 到 a 權值為-w

四、不等式組的轉化

做題時可能會遇到不等式中的符號不相同的情況,但我們可以對它們進行適當的轉化

(1)方程給出:x[n-1]-x[0]>=t ,可以進行移項轉化為: x[0]-x[n-1]<=-t。

(2)方程給出:x[n-1]-x[0](3)方程給出:x[n-1]-x[0]=t,可以轉化為x[n-1]-x[0]<=t&&x[n-1]-x[0]>=t,再利用(1)進行轉化即可

例題:

題目描述

bessie 在過去的 m 天內參加了 n 次**。但她已經忘了她每次**是在哪個時候了。

對於第 i 次**,bessie 記得它不早於第 si​ 天進行。另外,她還有 c條記憶,每條記憶形如乙個三元組 (a,b,x),含義是第 b 次**在第a 次**結束至少 x天後進行。

現在請你幫 bessie 算出在滿足所有條件的前提下,每次**的最早日期。

保證 bessie 的記憶沒有錯誤,這意味著一定存在一種合法的方案,使得:

第 i 次**不早於第 si天進行,且不晚於第 m 天進行;所有的記憶都得到滿足;

輸入格式

第一行三個整數 n,m,c。保證 1≤n,c≤105,92≤m≤109。

接下來一行包含 n 個整數 s1,s2,…,sn,

下面 c行每行三個整數 a,b,x,描述一條記憶。

輸出格式

輸出 n行,每行乙個整數,第 i 行的數表示第 i 次**的最早日期。

輸入輸出樣例

輸入4 10 3

1 2 3 4

1 2 5

2 4 2

3 4 4輸出1

638思路

題解:

#include

using

namespace std;

struct node e[

1000086];

int n, m, c;

int cnt;

int head[

1000086];

int dist[

1000086];

int sum[

1000086];

int vis[

1000086];

int s[

1000086];

const

int inf =

0x3f3f3f3f

;void addedge (

int u,

int v,

int w)

bool spfa ()}

}return

false;}

int main (

)for

(int i =

1, u, v, w; i <= c; i++

)bool hahaha =

spfa()

;for

(int i =

1; i <= n; i++

)printf

("%d\n"

, dist[i]);

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就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...