自我分析,為什麼用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...