題意
簡單來說:
每天對餐巾數量有一定的要求,用完的變成髒的。髒的可以拿去兩個店洗,分別花費a
aa天、b
bb錢;c
cc天、d
dd錢。可以留到之後洗,或者買新的花費p
pp求最小花費
題解顯然費用流,如何轉換呢?
首先最大流必須是合法情況,那麼一定餐巾數量夠。
那麼如何體現**利用呢?就是流量共用。
每天設定兩個點晚上和早上。
早上需要收到x
xx個餐巾,連向匯點,最大流就是符合情況的。
晚上得到x
xx個髒餐巾。
對於滯後洗的操作,第i
ii個晚上連向i+1
i+1i+
1個晚上即可。
流量共用的操作體現在洗餐巾,你花費b
bb或者d
dd給出一定流量到a
aa或c
cc天之後那天。
除此之外買餐巾的操作等價於源點連向早上。即可。
#include
#define for(i,l,r) for(int i=l;i<=r;i++)
using
namespace std;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define inf 0x3f3f3f3f
typedef
long
long ll;
const
int maxn =
2e4+
200;
int a[maxn]
;struct edge
;struct mcmf
void
addedge
(int from,
int to,ll cap,ll cost));
edges.
push_back
((edge));
tmp=edges.
size()
; g[from]
.push_back
(tmp-2)
; g[to]
.push_back
(tmp-1)
;}bool
spfa
(int s,
int t,ll& flow,ll& cost)
//入隊}}
}if(d[t]
==inf)
return
false
;//說明不連通了。
flow+
=a[t]
;//如果固定流量的話,可以在flow+a>=k的時候只增廣到k,然後終止程式
cost+
=d[t]
*a[t]
;int u=t;
while
(u!=s)
return
true;}
ll mincost()
}mf;
intmain()
cout
<}
網路流24題 餐巾計畫問題
傳送門 這個題我一開始沒把tot賦值成 1,然後調了1h。然後只拿了20,看了題解才知道漏了一種情況,那就是其實餐巾是可以留到第二天的。然後就沒了。對了,忘說做法了 尷尬 其實就是拆點,分別連邊,實現題目中的三種操作,具體可以看我的 include include include include i...
網路流24題餐巾計畫問題
乙個餐廳在相繼的 n n 天裡,每天需用的餐巾數不盡相同。假設第 i role presentation i i天需要 ri r i塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 p p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n r...
網路流24題 餐巾計畫問題
一道建模稍微有難度的網路流,首先你需要考慮到拆點,確實有點難度,你需要把一天拆成乾淨餐巾和骯髒餐巾,因為髒餐巾是可以轉化為乾淨餐巾的,你需要做到這個過程,所以你需要拆點,其次難想到的應該是如何解決快洗部和慢洗部每次只能洗一件並且需要洗多天,如何安排哪天的餐巾去洗就是個問題,所以可以考慮每天的餐巾都可...