★★★ 輸入檔案:napkin.in
輸出檔案:napkin.out
簡單對比
時間限制:5 s 記憶體限制:128 mb
【問題描述】
乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾(i=l,2,…,n)。餐廳可以從三種途徑獲得餐巾。
(1)購買新的餐巾,每塊需p分;
(2)把用過的餐巾送到快洗部,洗一塊需m天,費用需f分(f(3)把餐巾送到慢洗部,洗一塊需n天(n>m),費用需s分(s在每天結束時,餐廳必須決定多少塊用過的餐巾送到快洗部,多少塊送慢洗部。在每天開始時,餐廳必須決定是否購買新餐巾及多少,使洗好的和新購的餐巾之和滿足當天的需求量ri,並使n天總的費用最小。
【輸入】
輸入檔案共 3 行,第 1 行為總天數;第 2 行為每天所需的餐巾塊數;第 3 行為每塊餐巾的新購費用 p ,快洗所需天數 m ,快洗所需費用 f ,慢洗所需天數 n ,慢洗所需費用 s 。
【輸出】
一行,最小的費用
【樣例】
napkin.in
3 3 2 4
10 1 6 2 3
napkin.out
【資料規模】
n<=200,ri<=50
solution:
首先每天餐巾分為兩種情況,新買的和原來的。每天作為乙個點,由s向其連邊,容量為ri,花費為0.
每天可以向t連邊,容量為inf,花費為p,每天可購買餐巾無數次。將每天用過的餐巾再新建一層點,由於分配去快洗和慢洗的餐巾總數有限制,而並非分別有限制,所以快洗和慢洗不用分開討論,放在一起即可,這層點再分別向t建邊,容量為ri,花費為0,從而限制總容量。
使用快洗的餐巾,由i向i+m+t建邊,容量為inf,花費為f;使用慢洗的餐巾,由i向i+n+t建邊,花費為s。
但第i天洗完的餐巾也有可能再i+m以後的天中使用,所以再由i向i+1建邊,容量為inf,花費為0,這樣i+m以後天中就可以使用i+m天前洗完的餐巾了。
#include#include#includeusing namespace std;#define min(a,b) ((a)<(b)?(a):(b))
#define inf 99999999
int read()
ch=getchar();
} while(ch>='0'&&ch<='9')
return s*f;
}int day[205],t,p,m,f,n,s,s,t,r[521],tot,pre[520],dis[520];
struct oo c[160010];
void add(int x,int y,int z,int q)
void build()
if(i+n<=t)
if(idis[x]+c[i].cost)
}} }
if(pre[t]==-1) else
}int dinic(int s,int t) {
int f=0x7ffffff,ans=0;
while(bfs(s,t)) {
for(int i=t; i!=s; i=pre[i]) {
if(c[path[i]].vv
COGS461 網路流24題 餐巾
問題描述 乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f 3 把餐巾送到慢洗部,洗一塊需n天 n m 費用需s分 s在每天結束時,餐廳必須決定多少塊用過的餐巾送到快洗部,...
洛谷 P1251餐巾計畫問題 題解
傳送門 乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i 天需要 r i 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天 n m 其費用為 s 分 s 每天結束時,餐...
codevs 1237 餐巾計畫問題
引用 24題 把每天分為二分圖兩個集合中的頂點xi,yi,建立附加源s匯t。1 從s向每個xi連一條容量為ri,費用為0的有向邊。2 從每個yi向t連一條容量為ri,費用為0的有向邊。3 從s向每個yi連一條容量為無窮大,費用為p的有向邊。4 從每個xi向xi 1 i 1 n 連一條容量為無窮大,費...