乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i天需要 ri 塊餐巾。餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分;或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分;或者送到慢洗部,洗一塊需 n 天,其費用為 s 分(s< f )。
每天結束時,餐廳必須決定將多少塊髒的餐巾送到快洗部,多少塊餐巾送到慢洗部,以及多少塊儲存起來延期送洗。但是每天洗好的餐巾和購買的新餐巾數之和,要滿足當天的需求量。
試設計乙個演算法為餐廳合理地安排好 n 天中餐巾使用計畫,使總的花費最小。
第 1 行有 6 個正整數 n 、p、m、f、n、s。
n 是要安排餐巾使用計畫的天數, p 是每塊新餐巾的費用, m 是快洗部洗一塊餐巾需用天數,f 是快洗部洗一塊餐巾需要的費用,n 是慢洗部洗一塊餐巾需用天數,s 是慢洗部洗一塊餐巾需要的費用。
接下來的 n 行是餐廳在相繼的 n 天裡,每天需用的餐巾數。
輸出餐廳在相繼的 n天裡使用餐巾的最小總花費。
3 10 2 3 3 256
7145
1<=n<=1000
網路流的關鍵依然在建圖上,此題建圖非常巧妙:
1.首先將每一天拆為兩個點,增加s,t兩個源匯點。
2.由s向每一天連一條容量為ri,費用為0的邊,最後最大流即各邊之和,每一天的拆的點向t連一條容量為ri,費用為0的邊。
3.由s向每一天所拆點連一條容量為inf,費用為p的邊,表示每天購買的餐巾數。
4.由第i天向第i+1天(i5.由第i天向第i+m天(i+m<=n)所拆點連一條容量為inf,費用為f的邊,表示送快洗部洗的餐巾。
6.由第i天向第i+n天(i+n<=n)所拆點連一條容量為inf,費用為s的邊,表示送慢洗部洗的餐巾。
7.最後在圖上跑一遍最小費用最大流即可,答案即為最小費用。
#includeusing namespace std;
const int maxn=2e3+10;
const int maxm=1e5+10;
const int inf=0x3f3f3f3f;
int n,m,s,t,cnt,cost;
int head[maxn],dis[maxn],vis[maxn],work[maxn];
int nxt[maxn],to[maxn],w[maxn],c[maxn];
queueq;
void add(int u,int v,int f,int p)
void add(int u,int v,int f,int p)
bool spfa()
}} }
return dis[t]}int dfs(int u,int dist)
work[u]=1;
int res=0;
for(int i=head[u];i!=-1;i=nxt[i])
}} return res;
}int dinic()
int main()
printf("%d\n",dinic());
return 0;
}
餐巾計畫問題 網路流24題 費用流 zkw
乙個餐廳在相繼的 nn 天裡,每天需用的餐巾數不盡相同。假設第 ii 天需要 r iri 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 pp 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 nn 天 n mn m 其費用為 ss 分 ss ...
網路流 24 題 餐巾計畫
這道題目很關鍵的一點就是,要明白用的餐巾和洗的餐巾是兩個系統。所以我們把每一天所用餐巾直接用乙個源點和匯點連線。解決第乙個系統。此時可能會洗餐巾,所以我們另起乙個點,從源點每一天引出髒的餐巾,數目依然是當天所用的餐巾數量,然後從這個點連線到m天後的第一系統的點和n天後第一系統的點,費用分別為f和s,...
網路流24題 餐巾計畫
乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f p 如m l時,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情況也如此。3 把餐巾送到慢洗部,洗一塊需n天 n m ...