乙個餐廳在相繼的n 天裡, 每天需用的餐巾數不盡相同。 假設第i天需要ri塊餐巾(i=1,2,…,n)。餐廳可以購買新的餐巾,每塊餐巾的費用
為p分;或者把舊餐巾送到快洗部,洗一塊需 m天,其費用為 f 分;或者送到慢洗部,洗一塊需 n 天(n>m),其費用為 s這道題是一道最小費用最大流的題目,然而有一些神犇寫的是dinic,速度碾壓眾人qaq
對於這道題,我們可以建立二分圖(xi
,yi )。
從源點到每個xi
、每個yi
到匯點均連一條容量為ri
、花費為0的邊;
從源點到每個yi
,連一條容量為inf、花費為p的邊;
對於每乙個xi
(i < n),連一條到xi
+ 1
、容量為inf、花費為0的邊;
對於每乙個xi
(i < n-m),連一條到yi
+ m
、容量為inf、花費為f的邊;
對於每乙個xi
(i < n-n),連一條到yi
+ n
、容量為inf、花費為s的邊。
跑最小費用最大流,得到結果即為答案。
這道題很有代表性,建出的二分圖雖然不像題目描述中那樣,但是其中從源點直接流向每個xi
這種等量替代的方法很值得學習。
code:
#include
#include
typedef
long
long ll;
const
int inf=1e9;
struct
queue
inline
void push(int n)
inline
int front()
inline
void pop()
inline
bool empty()
}q;struct edge
a[100000];
int head[20000];
int dis[20000];
int h[20000];
int f[20000];
int u[20000];
bool b[20000];
int n,x,num=1,s,t,c1,c2,c3,d1,d2;
inline
int min(int a,int b)
inline
int spfa(ll &x)
}if(dis[t]>inf) return
0; x+=u[t]*dis[t];
int p=t;
while(p!=s)
return1;}
inline ll mcmf()
int main()
餐巾計畫問題
乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f p 如m l時,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情況也如此。3 把餐巾送到慢洗部,洗一塊需n天 n m ...
餐巾計畫問題
餐巾計畫問題 time limit 1000 ms memory limit 65536 kb description 乙個餐廳在相繼的n 天裡,每天需用的餐巾數不盡相同。假設第i天需要ri塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為p分 或者把舊餐巾送到快洗部,洗一塊需m天,其費...
題解 餐巾計畫問題
傳送門 乙個餐廳在相繼的 nnn 天裡,每天需用的餐巾數不盡相同。假設第 iii 天需要 rir iri 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 ppp 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 nnn 天 n mn mn m ...