傳送門
最小費用最大流。
每天拆成兩個點,i表示用完的餐巾,i+n表示乾淨的餐巾。
s向i連容量為ri費用為0的邊,表示每天用髒的ri條餐巾。
i+n向t連容量為ri費用為0的邊,表示每天需要用ri條餐巾。
s向1+n連容量為inf費用為p的邊,表示新買進的乾淨餐巾,需要新買的在第一天全買了。
兩種洗法都是,i 向 i+time+n 連容量為xx,費用為cost的邊,表示第i天用完就洗乾淨放在洗完的第一天看哪天要用。
i+n向i+1+n連容量為inf,費用為0的邊,表示前一天沒用的(新買的/洗乾淨的)乾淨餐巾,免費留到下一天用。
不明白為什麼其他人都要把髒的留到什麼時候需要再洗,不應該立刻洗了屯著麼。。
//view codeachen
#include#include
#include
#include
#include
#include
#include
#include
#include
const
int n=1e6+7,inf=0x7fffffff
;typedef
long
long
ll;using
namespace
std;
intn,pp,kt,kv,mt,mv;
template
void read(t &x)
struct
edge
edge(
int u,int v,int fl,int cap,int cost,int
nx):u(u),v(v),fl(fl),cap(cap),cost(cost),nx(nx){}
}e[n];
int fir[n],ecnt=1
;void add(int u,int v,int cap,int
cost)
intvis[n],dis[n],p[n],tot;
queue
que;
int spfa(int s,int
t) }}}
return dis[t]!=inf;
}int calc(int s,int
t)
int max_flow(int s,int
t) int
main()
int ans=max_flow(s,t);
printf(
"%d\n
",ans);
return0;
}
codevs 1237 餐巾計畫問題
引用 24題 把每天分為二分圖兩個集合中的頂點xi,yi,建立附加源s匯t。1 從s向每個xi連一條容量為ri,費用為0的有向邊。2 從每個yi向t連一條容量為ri,費用為0的有向邊。3 從s向每個yi連一條容量為無窮大,費用為p的有向邊。4 從每個xi向xi 1 i 1 n 連一條容量為無窮大,費...
P1251 餐巾計畫問題
題面 一道特別棒的費用流好題,思路非常巧妙 對於每一天,我們分為早上和晚上兩個節點 每天早上會消耗 r i 條乾淨的毛巾,可以視為流向匯點,所以我們向匯點連一條流量為 r i 費用為 0 的邊 每天晚上會產生 r i 條髒毛巾,可以視為從源點流出,所以我們從源點連一條流量為 r i 費用為 0 的邊...
洛谷 1251 餐巾計畫問題
題鏈 題解 一點啟示 建圖時要考慮到流量問題,即為了方便使用最小費用最大流演算法,要把流量最大時為最終目的考慮進建圖。拆點,每天拆為兩個點i,i 表示每天開始和每天結束 s,i,ai,p 在第i天最多買ri個餐巾,花費為p i,t,ai,0 第i天要用ai塊餐巾 s,i ai,0 第i天用剩的ai塊...