乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾(i=l,2,…,n)。餐廳可以從三種途徑獲得餐巾。
(1)購買新的餐巾,每塊需p分;
(2)把用過的餐巾送到快洗部,洗一塊需m天,費用需f分(f<p)。如m=l時,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情況也如此。
(3)把餐巾送到慢洗部,洗一塊需n天(n>m),費用需s分(s<f)。
在每天結束時,餐廳必須決定多少塊用過的餐巾送到快洗部,多少塊送慢洗部。在每天開始時,餐廳必須決定是否購買新餐巾及多少,使洗好的和新購的餐巾之和滿足當天的需求量ri,並使n天總的費用最小。
共 3 行:
第 1 行為總天教;
第 2 行為每天所需的餐巾塊數;
第 3 行為每塊餐巾的新購費用 p ,快洗所需天數 m ,快洗所需費用 f ,慢洗所需天數 n ,慢洗所需費用 s 。
一行,最小的費用
3 3 2 4
10 1 6 2 3
資料規模:
n<=200,ri<=50
正解:費用流。這題很難啊,稍不留神就容易連錯邊。
建圖如下:第i天拆成xi和yi,源點向xi建一條容量為ri,費用為0的弧,yi向匯點建一條容量為ri,費用為0的弧。源點向yi建一條容量為inf,費用為p的弧,xi向yi+m,yi+n分別容量為1,對應費用的流。xi向xi+1建一條容量為inf,費用為0的弧。別的都還好,最後一條易錯。。
//it is made by wfj_2048~
#include #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf (1<<30)
#define il inline
#define rg register
#define ll long long
#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using
namespace
std;
struct edgeg[1000010
];int head[1010],dis[1010],f[1010],fa[1010],p[1010],q[1000010],n,pp,m,c,t,s,s,t,flow,cost,num=1
;il
intgi()
il void insert(rg int
from,rg int to,rg int cap,rg int cost),head[from]=num; }
il int bfs(rg int s,rg int
t) }
}if (dis[t]==inf) return
0; flow+=f[t],cost+=f[t]*dis[t];
for (rg int x=t;x!=s;x=fa[x]) g[p[x]].flow+=f[t],g[p[x]^1].flow-=f[t];
return1;
}il
int mcmf(rg int s,rg int t)
il void
work()
pp=gi(),m=gi(),c=gi(),t=gi(),s=gi(); insert(s,n+1,inf,pp),insert(n+1,s,0,-pp);
for (rg int i=1;i<=n;++i)
printf(
"%d\n
",mcmf(s,t)); return;}
intmain()
網路流 24 題 餐巾計畫
這道題目很關鍵的一點就是,要明白用的餐巾和洗的餐巾是兩個系統。所以我們把每一天所用餐巾直接用乙個源點和匯點連線。解決第乙個系統。此時可能會洗餐巾,所以我們另起乙個點,從源點每一天引出髒的餐巾,數目依然是當天所用的餐巾數量,然後從這個點連線到m天後的第一系統的點和n天後第一系統的點,費用分別為f和s,...
網路流24題 餐巾計畫(費用流)
乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i天需要 ri 塊餐巾。餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天,其費用為 s 分 s f 每天結束時,餐廳必須決定將多少塊髒的餐巾送到快...
網路流24題 餐巾計畫問題
傳送門 這個題我一開始沒把tot賦值成 1,然後調了1h。然後只拿了20,看了題解才知道漏了一種情況,那就是其實餐巾是可以留到第二天的。然後就沒了。對了,忘說做法了 尷尬 其實就是拆點,分別連邊,實現題目中的三種操作,具體可以看我的 include include include include i...