poweroj1745 餐巾計畫問題

2022-09-19 08:21:09 字數 1323 閱讀 5800

傳送門 

最小費用最大流。

每天拆成兩個點,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的邊,表示前一天沒用的(新買的/洗乾淨的)乾淨餐巾,免費留到下一天用。

不明白為什麼其他人都要把髒的留到什麼時候需要再洗,不應該立刻洗了屯著麼。。

//

achen

#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;

}

view code

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塊...