洛谷P1251 餐巾計畫問題 最小費用最大流

2021-09-07 19:19:17 字數 1336 閱讀 3816

一家餐廳,第$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 的邊...