一家餐廳,第$i$天需要$r_i$塊餐巾,每天獲取餐巾有三種途徑
1、以$p$的費用買
2、以$f$的費用送到快洗部,並在$m$天後取出
3、以$s$的費用送到慢洗部,並在$n$天後取出
問滿足要求時的最小費用
一道非常不錯的網路流,應該不難看出是費用流。
首先進行拆點,把每個點早上和晚上,然後進行連邊
從$s$向i連邊$(0, r_i)$,表示到了晚上有$r_i$塊髒餐巾
從$i'$向$t$連邊$(0, r_i)$,表示早上有$r_i$塊新餐巾
從$s$向$i'$連邊$(p, inf)$,表示每天早上可以以$p$的費用無限提供餐巾
從$i$向$i'$連邊$(0, inf)$,表示每天晚上的髒餐巾可以留到第二天晚上
從$i$向$i' + m$連邊$(f, inf)$,表示快洗
從$i$向$i' + n$連邊$(s, inf)$,表示慢洗
這樣既可以保證每天的$r_i$滿足要求,又能保證最小費用。so nice
#include#include#include
#define ll long long
using
namespace
std;
const
int maxn = 1e5 + 10, inf = 1e9 + 10
;inline
intread()
while(c >= '
0' && c <= '
9') x = x * 10 + c - '
0', c =getchar();
return x *f;
}int
n, s, t;
intr[maxn], p, m, f, n, s;
struct
edge e[maxn];
inthead[maxn], num;
inline
void add_edge(int x, int y, int w, int
f) ;
head[x] = num++;
}inline
void addedge(int x, int y, int w, int
f) int
dis[maxn], vis[maxn], pre[maxn];
bool
spfa() }}
return dis[t] <=inf;
}ll f()
ll mcmf()
intmain()
printf(
"%lld
", mcmf());
}
洛谷 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 每天結束時,餐...
P1251 餐巾計畫問題
題面 一道特別棒的費用流好題,思路非常巧妙 對於每一天,我們分為早上和晚上兩個節點 每天早上會消耗 r i 條乾淨的毛巾,可以視為流向匯點,所以我們向匯點連一條流量為 r i 費用為 0 的邊 每天晚上會產生 r i 條髒毛巾,可以視為從源點流出,所以我們從源點連一條流量為 r i 費用為 0 的邊...