網路流24題 餐巾計畫(費用流)

2022-08-22 02:15:10 字數 1528 閱讀 3618

乙個餐廳在相繼的 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 ...