cogs 461 餐巾 題解

2022-05-01 03:21:08 字數 1635 閱讀 8609

★★★   輸入檔案: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 連一條容量為無窮大,費...