AcWing 1170 排隊布局

2022-10-09 06:27:08 字數 1990 閱讀 6986

本題同樣是差分約束的問題,要求\(1\)到\(n\)之間可能最大的距離,這使得我們更加深刻的理解了差分約束的思想。

在\(acwing\)

\(1169\) 糖果裡,仔細的講解了差分約束的基本思想,以及求不等式組的最大解需要求最短路求最小解需要求最長路,這裡不等式解的最大最小都是相對而言的。比如\(a_2 <= a_1 + 1,a_3 <= a_2 + 1\),求最短路和最長路的建圖如下圖所示:

對於最短路而言,設起點\(a_1 = 0\),求得\(a_2\)的最大值是\(1\),\(a_3\)的最大值是\(2\);對於最長路而言,設\(a_3 = 0\),則\(a_2\)的最小值是\(-1\),\(a_1\)的最小值是\(-2\),所以所謂的最值都是相對的,本題求\(1\)到\(n\)之間的最大距離很能夠體現這種相對的關係。

下面梳理下已知的結論:對於同乙個不等式組,最短路和最長路建圖是完全不同的,邊的大小互為相反數,方向相反,如果不等式組無解,即沒有合法的一組解使得所有的不等式都成立,那麼建立的最短路圖中一定存在負環,建立的最長路的圖中一定存在正環。如果不等式組有解,最短路求得的是最大解,最長路求得的是最小解。

要求1到n之間的距離,不妨設1號點的座標就是0,從0出發到達終點n,要想距離最大,則n號點的解就要最大,所以需要求最短路。當然如果將n的座標設定為0,也可以通過求最長路來使得1到n之間的距離最大。本題的約束條件有三個,ai-1 <= ai;ai - aj <= l;ai - aj >= d。暫且不去分析具體的約束條件,先討論乙個問題,什麼情況下起點到終點的距離可以無限大。關於這個問題,很多部落格僅僅給出了必要條件,比如說從起點到達不了終點,圖中的兩點間沒有可達的路徑,沒有約束距離就無限大,但這僅僅是必要條件而非充分條件。比如下面的不等式組:a1 <= a2 - 1,a2 <= a3 - 1,最短路建圖如下:

從a3是可以到達a1的,圖中沒有孤立的點,a3 = 0時,a1就可以無限小,他們的距離就無限大。這個簡單的例子可以看出,差分約束的不等式組對應的圖如果沒有環,起點和終點的距離是可以無限大的。要想兩點間距離有限,需要圖中有乙個適當的環,來約束解的範圍。上圖的不等式組可以推出a1 <= a3 - 2,那麼我再加上乙個不等式約束a1 >= a3 - 4,,就成功的將a1到a3之間的距離限制在4個單位以內了。對應圖中的表現不過是a1到a3連一條邊權為4的邊,我們分析此時環的長度4 - 1 - 1 = 2是大於0的。所以我們可以得出下面的結論:最短路的圖中如果存在負環,差分約束問題無合法解,如果存在正環,則正環上任意兩點間的距離都是有限的,不存在環的圖上任意兩點間的距離都可以是無限大的。這個結論可以模擬到最長路的圖中。換一種表達形式的話就是如果要圖中的兩點間距離有限,只需要存在乙個正環,且這兩個點都在環上。那麼本題我們是否需要判斷了負環還要判斷正環呢?實際上是不需要的。

第乙個約束條件ai >= ai-1,構建的最短路圖中an可以到達an-1,an-1可以到達an-2,...。所以an可以到達每一點,包括a1。我們先以an為起點,求一遍最短路,如果存在負環,則不等式組無解,如果不存在負環,那麼不等式組肯定有解,下面要判斷的就是an - a1的結果是否可以無限大。在確定了不等式組有解的情況下,我們以a1為起點再求一遍最短路,當然a1不一定能夠到達每一點,如果a1到達不了an,說明不存在乙個環,環上同時包含a1到an。如果a1出發可以到達an,則一定存在由a1、an構成的正環。從ai出發可以到達an,an出發可以到達a1,這個條件保證了環的存在。第一次以an為起點求最短路時不存在負環,說明這個環一定不是負環,那麼就是正環了(即使環的長度為0也是有解的)。根據我們上一段推出的結論可知,此時a1和an之間的距離是有限的,並且第二次求最短路過程中a1是起點,求得的an是最大值,所以此時的an就是我們要求的最大距離了。

最後再總結下本題給我們的經驗(僅僅是個人經驗總結)。最短路存在負環,差分約束問題無解,最短路存在正環,環上任意兩點之間距離有限,最短路不存在環,任意兩點間距離可以是無窮大;最長路存在正環,差分約束問題無解,最長路存在負環,環上任意兩點之間距離有限,最長路不存在環,任意兩點間距離可以是無窮大。總的**如下:

AcWing 1170 排隊布局(差分約束)

當排隊等候餵食時,奶牛喜歡和它們的朋友站得靠近些。農夫約翰有 n 頭奶牛,編號從 1 到 n,沿一條直線站著等候餵食。奶牛排在隊伍中的順序和它們的編號是相同的。因為奶牛相當苗條,所以可能有兩頭或者更多奶牛站在同一位置上。如果我們想象奶牛是站在一條數軸上的話,允許有兩頭或更多奶牛擁有相同的橫座標。一些...

AcWing1170 排隊布局(差分約束)

對於第二問和第三問,只需要把1作為絕對值0點,即可在物理意義上解決,差分約束的關鍵是找到所有關係,一般而言,如果題目沒給,可以考慮超級原點。includeusing namespace std const int n 1e5 10 const int inf 0x3f3f3f3f int h n e...

281 排隊布局

當排隊等候餵食時,奶牛喜歡和它們的朋友靠近些。fj 有n頭奶牛,編號從1到n,沿一條直線站著等候餵食。奶牛排在隊伍中的順序和它們的編號是相同的。因為奶牛相當苗條,所以可能有兩頭或者更多奶牛站在同一位置上。如果我們想象奶牛是站在一條數軸上的話,允許有兩頭或更多奶牛擁有相同的橫座標。一些奶牛相互間存有好...