談SPFA解差分約束最大值最小值的原理

2021-08-26 06:55:06 字數 1232 閱讀 7171

自我分析,為什麼用spfa解差分方程,用最短路徑求差分方程的最大解;用最長路徑求差分方程的最小解.

如果給出的是一組:

a2 - a1 <= k1

a3 - a1 <= k2

之類的一組小於等於的不等式組...那麼看 a - b <= k .. 化成 a < = b + k ... 這時構邊是 b 為起點,a 為終點,權值為k的邊...

而此時spfa是求最短路徑的relax是

if ( d [ line.end ] > d [ line.start ] + line.wight )

d [ line.end ] = d [ line.start ] + line.wight;

那麼 d [ line.end ] 的值最終將是 d [ line.start ] + line.wight 裡最小的...若先令了乙個源點...則這個d [ line.end ]就是 line.end 這個點的值..而這個值滿足所有的約束條件..並且等於了最小的 a + k 但不會比最小的還要小..也就是 line.end 滿足的是所有 line.end <= a+k 中a+k最小的...雖然line.end再小些也會滿足與其所有 <= 的 關係..但正因為spfa更新時一直是 = 所以求出的就是 d [ line.end ] 滿足所有約束條件的最大值..

如果給出的是一組:

a2 - a1 >= k1

a3 - a1 >= k2

....

之類的一組小於等於的不等式組...那麼看 a - b >= k .. 化成 a > = b + k ... 這時構邊是 b 為起點,a 為終點,權值為k的邊...

而此時spfa是求最長路徑,relax是

if ( d [ line.end ] < d [ line.start ] + line.wight )

d [ line.end ] = d [ line.start ] + line.wight;

那麼 d [ line.end ] 的值最終將是 d [ line.start ] + line.wight 裡最大的...若先令了乙個源點...則這個d [ line.end ]就是 line.end 這個點的值..而這個值滿足所有的約束條件..並且等於了最大的 a + k 但不會比最大的還要大..也就是 line.end 滿足的是所有 line.end >= a+k 中 a+k最大的...雖然line.end再大些也會滿足與其所有 >= 的關係..但正因為spfa更新時一直是 = 所以求出的就是 d [ line.end ] 滿足所有約束條件的最小值..

最大值 最小值

求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...

最小與最大值

輸入 乙個包含n個數的集合a 輸出 集合a的最大值最小值 單一求解最大值與最小值可以通過打擂台的方法來實現,求解最大值或者最小值需要比較n 1次,若同時要求求出最大值與最小值比較的次數為2 n 2次.事實上我們有比這個更快的演算法,比較次數為3n 2.具體做法為 記錄已知的最小值與最大值,對輸入 的...

最大值最小化(最大值盡量小)

from 給出是個序列,如1 2 3 2 5 4 將其劃分成m個連續的子串行,每個子串行最少有乙個元素,怎樣使每個子串行的和的最大值最小 include include using namespace std define n 10 define inf 1000 int juge int a,in...