差分約束系統定義(引自維基百科):如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。
例如,有如下不等式組:
我們可以把它寫成如下矩陣的形式:
定義左邊的矩陣為a,中間的列向量為 x, 右邊的列向量為k。
我們觀察一下a可以發現它和我們在離散數學中講圖的時候講了乙個關聯矩陣很像。
矩陣a的特點是每行只有乙個1和乙個-1,其餘列都是0。
而關聯矩陣的特點是每列只有乙個1和乙個-1,其餘行為0.
即a的轉置矩陣就是乙個關聯矩陣。
那麼我們想想,是否可以通過求解圖的最短路徑來求得不等式組的乙個可行解呢?
結論是可以的。
對於每乙個差分約束系統,我們根據矩陣a來建立圖g(v, e),而g的關聯矩陣就是a的轉置矩陣,邊權存在二維陣列w中。假設我們現在要求單源最短路,將各個定點的最短距離存到對應的dis[v]中。最後我們要得到的結果一定滿足: dis[v] <= dis[u] + w[u][v]. 變形一下得到: dis[v] - dis[u] <= w[u][v]. 另dis[v] 為 xv, dis[u]為xu,有xv - xu <= w[u][v]. 可以看到當前單源最短路問題與差分約束系統問題的等價性。
故可以通過求解單源最短路來求解差分約束問題。當圖中存在負環的時候,不等式組無解,否則有解,並且xi的解為dis[i]。若dis[i] = inf,則xi的值為任意值。
hdu1531是一道入門題。
題意:給定未知數的個數n,同時給出m個約束條件, 均以(asi + asi+1 + ... + asi+n) < k 或者 (asi + asi+1 + ... + asi+n) > k形式出現。問是否存在可行解。
定義一下sigma(n) = a1 + a2 + a3 + ... + an.
則 ai + ... + aj = sigma(j) - sigma(i-1).這樣就可以求解了。
**:
#include#include#includeusing namespace std;
const int n = 128;
const int inf = 0x3f3f3f3f;
int n, m, cnt;
struct edge ;
int fir[n];
edge edge[n];
int vis[n], dis[n];
int outque[n];
void init()
void addedge(int u, int v, int w)
bool spfa(int s) }}
}return true;
}int main()
for(int i = 1; i <= n; i++)
if(spfa(n+1))
printf("lamentable kingdom\n");
else printf("successful conspiracy\n");
}return 0;
}
差分約束系統
差分約束 若 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就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...