P1251 餐巾計畫問題

2022-03-13 04:43:10 字數 1262 閱讀 4928

題面

一道特別棒的費用流好題,思路非常巧妙

對於每一天,我們分為早上和晚上兩個節點

每天早上會消耗\(r_i\)條乾淨的毛巾,可以視為流向匯點,所以我們向匯點連一條流量為\(r_i\),費用為\(0​\)的邊

每天晚上會產生\(r_i\)條髒毛巾,可以視為從源點流出,所以我們從源點連一條流量為\(r_i\),費用為\(0\)的邊

然後我們考慮以下四種情況:買毛巾,慢洗,快洗,留著攢味

首先是買毛巾,我們直接讓毛巾從源點流向每個早上,所以從源點連一條流量無限大,費用為\(p\)的邊

然後是慢洗,我們從每個晚上向\(n\)天之後的早上連一條流量無限大,費用為\(s\)的邊,快洗處理方式類似

最後是儲存,我們直接從每個晚上向下乙個晚上連一條流量無限大,費用為\(0\)的邊即可

以上所建的所有邊都需要建對應的反邊,這也是費用流的常規寫法

圖建好之後,這道題可以說已經做完了,寫模板就是了

下面放**

#include#include#include#include#include#include#define ll long long

#define gc getchar

#define maxn 4005

#define maxm 100005

using namespace std;

inline ll read()

while(isdigit(p))

return f?-a:a;

}int n,s,t,a,b,c,g,f;ll ans;

struct ahahae[maxm<<1];int tot,head[maxn];

inline void add(int u,int v,int w,int f);head[u]=tot++;

}dequeq;

int bi[maxn],d[maxn],fl[maxn],la[maxn];

int spfa()

}return ~la[t];

}int main()

for(int i=1;ia=read();b=read();c=read();g=read();f=read();

for(int i=1;i<=n;++i)

for(int i=n-b;i;--i)

for(int i=n-g;i;--i)

while(spfa())

} printf("%lld\n",ans);

return 0;

}

P1251 餐巾計畫問題

因為髒的衣服在一天結束時才會有,乾淨的一天開始才會有,考慮拆點。再考慮乾淨的衣服都是要被收集起來的,所以乾淨的要流向超匯。而髒的衣服可以從超源免費獲得所需要的個數,而乾淨的衣服只能購買。看張圖吧,假如只有 1 個點的話,且需要無限多的衣服。顯然前者正確,後者矛盾 收集了髒衣服 再者,這種建圖會無法收...

洛谷 P1251 餐巾計畫問題

吃什麼 先說建圖 經典構圖題。將每一天拆成兩個點i,i 加如下6條邊 s i,r i,p 在第 i 天可以買至多ri 個餐巾,每塊 p 分 i t,r i,0 第i 天要用ri 塊餐巾 s i ri,0 第 i 天用剩的ri 塊舊餐巾 i i m,f 第 i 天的舊餐巾送到快洗部,每塊 f分 i i...

洛谷 P1251餐巾計畫問題 題解

傳送門 乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i 天需要 r i 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天 n m 其費用為 s 分 s 每天結束時,餐...