1. 程式人生 > 其它 >AcWing 361 觀光奶牛

AcWing 361 觀光奶牛

題目傳送門

本題考察\(01\)分數規劃
\(01\)分數規劃是這樣的一類問題:有一堆物品,每一個物品有一個收益\(a_i\),一個代價\(b_i\),我們要求一個方案使選擇的\(∑a_i / ∑b_i\) 最大。

比如說在\(n\)個物品中選\(k\)個物品,使得\(∑a_i / ∑b_i\) 最大,並且我們知道ai和bi的範圍,間接就知道了∑ai / ∑bi 的範圍,有範圍的問題如果再具有單調性就可以用二分解決,如果我們能夠知道對於某個mid,存在∑ai / ∑bi >= mid,就說明最終的解不小於mid了,這就是本問題的單調性。要使∑ai / ∑bi >= mid,只要mid * ∑bi <= ∑ai即可,即∑(midbi - ai) <= 0,所以可以按照 mid

bi - ai的大小排序,前k個物品之和小於0就說明這樣的mid是存在的了。

對於本題而言,既存在點權又存在邊權不好計算。要使∑fi / ∑ti最大,只需要像上面解決一般的01分數規劃問題那樣二分即可,如果∑(midti - fi) <= 0,就說明這樣的mid存在。本題又是求圖中一個環上的點滿足這樣的條件,所以本質上就是看有沒有負權迴路存在。一般的01規劃問題ai和bi一一對應,而本題中一個點可能連線多條邊,但是一條邊有且僅有兩個頂點,我們可以把每個頂點都收縮到它的各條出邊上(收縮到入邊上也是一樣道理)。或者說,原圖中有點權f[i],邊權t[i],我們現在是要構造一張新圖,新圖的邊權為midti - fi,只要這張新圖存在負權迴路,就說明這樣的mid是存在的。

另外需要注意的是mid的取值是浮點數,我們在對浮點數做二分時,mid不能隨便加減一了,不論存不存在這樣的mid,l或者r都只能等於mid,整數二分的上下取整問題對於浮點數二分也是不存在的。

本題雖然看起來複雜,但是隻需要對圖的邊權做下對映,很容易發現就是求圖中有沒有負環的問題,解決起來還是比較簡單的,總的程式碼如下: