1. 程式人生 > >差分約束入門+總結

差分約束入門+總結

給定一串序列,長度為n。a1,a2,a3......ana_1,a_2,a_3......a_n 並給定m的限制條件,條件的格式為 aiaj<=ca_i-a_j<=cana1a_n-a_1的最大值 考慮序列三個數a,b,c ab<=v1a-b<=v_1 bc<=v2b-c<=v_2 ac<=v3a-c<=v_3 ac<

=min(v3,(v1+v2))\Longrightarrow a-c<=min(v_3,(v_1+v_2)) 這個縮小約束條件的過程就是求最短路的過程 所以可以用最短路模型來解決

模型1.給定一串序列 a1ana_1 - a_n 並給出若干限制條件aiaj<=ca_i - a_j<=c,要求 ak1a_{k1}ak2a_{k2} 的最大可能差值? 方法:對於每個限制條件aiaj<=ca_i - a_j<=c

,從點j到點i建立一條邊,求ak1a_{k1}ak2a_{k2} 的最短路即可。

推廣 ak1a_{k1}ak2a_{k2} 的最小可能差值? 就是反一反 ab>=v1a-b>=v_1 bc>=v2b-c>=v_2 ac>=v3a-c>=v_3 ac>=max(v3,(v1+v2))\Longrightarrow a-c>=max(v_3,(v_1+v_2))

要滿足所有條件,(a-c的)範圍擴大,求最長路

模型2.給定一串序列 a1ana_1 - a_n 並給出若干限制條件aiaj>=ca_i - a_j>=c,要求 ak1a_{k1}ak2a_{k2} 的最小可能差值? 方法:對於每個限制條件aiaj>=ca_i - a_j>=c,從點j到點i建立一條邊,求ak1a_{k1}ak2a_{k2} 的最長路即可。

條件轉換: ab<=cba>=ca-b<=c \Longrightarrow b-a>=c ab=cab<=c,ba<=ca-b=c \Longrightarrow a-b<=c , b-a<=c … (簡單數學變換)

模型2也可轉換為模型1 ab>=v1a-b>=v_1 ``_````ba<=v1b-a<=-v_1 bc>=v2b-c>=v_2 \Longrightarrow cb<=v2c-b<=-v_2 ac>=v3a-c>=v_3 ```````ca<=v3c-a<=-v_3ak2a_{k2}ak1a_{k1} 的最短路

對於一個求最短路(最長路)約束條件有可能有三種情況: 1.有上界,即有解 2.無解(有負環) 3.任意多的解(約束條件不夠強,或者說圖不強連通)

有解就是最短路 無解就是有負環,最短路負無窮大 無窮解就是不連通,最短路正無窮大