Luogu P1251 餐巾計畫問題

2022-04-02 23:15:44 字數 1672 閱讀 5892

不得不說這是一道非常好的費用流神題。

建圖清新自然,構建沒有毒瘤。實為網路流24題中難得一見的好題。

我們考慮一下網路流的建圖

首先拆點並建立超級源點ss和超級匯點\(t\)(常見套路),我們把每一天拆成早上\(x_i\)和晚上\(y_i\)

然後考慮每天早上要向\(t\)提供\(r_i\)條乾淨的餐巾,而\(s\)要向每天晚上提供\(r_i\)條髒餐巾。

然後就是一些購買和洗的問題了,這個我們就來細緻地講一講建邊(這裡邊帶費用)

同上,從\(x_i\)向\(t\)連一條流量為\(r_i\),費用為\(0\)(又沒買餐巾怎麼要錢?)的邊。

同上,從\(s\)向\(y_i\)連一條流量為\(r_i\),費用為\(0\)的邊。

考慮每天早上購買餐巾,我們從\(s\)向\(x_i\)連一條流量為\(\infty\),費用為\(p\)的邊。

然後是快洗,我們從\(y_i\)向\(x_\)連一條流量為\(\infty\),費用為\(f\)的邊。表示可以在第\(i\)天晚上送一些餐巾去洗。需要注意的是\(i+m\le n\)。

慢洗同上,我們從\(y_i\)向\(x_\)連一條流量為\(\infty\),費用為\(s\)的邊。

然後有乙個大坑點來了:每天晚上髒的餐巾不一定一定要去洗,也可以攢到第二天再洗或者直接不管了。因此我們從所有的\(y_i(1\le i向\(y_\)連一條流量為\(\infty\),費用為\(0\)的邊。注意這裡必須由晚上連至晚上,因為髒餐巾不能在早上使用

然後我們都要建反向邊。然後直接跑ek+spfa是可以直接過的。但注意開long long

code

#include#include#includeusing namespace std;

typedef long long ll;

const ll n=4005,inf=1e18;

queue q;

struct edge

e[n<<3];

ll head[n],dis[n],cap[n],pre[n],last[n],s,t,n,x,y,cnt=-1;

bool vis[n];

inline char tc(void)

inline void read(ll &x)

inline void add(ll x,ll y,ll c,ll f)

inline void insert(ll x,ll y,ll c,ll f)

inline ll min(ll a,ll b)

}return pre[t]^-1;

}inline void mcmf(void)

}printf("%lld",tot);

}int main()

for (read(x),read(y),i=1;i+x<=n;++i)

insert(i+n,i+x,inf,y);

for (read(x),read(y),i=1;i+x<=n;++i)

insert(i+n,i+x,inf,y);

mcmf(); return 0;

}

Luogu P1251餐巾計畫(上下界費用流)

題目鏈結 學了一下上下界費用流,似乎很nb。但是我說得不好,所以這裡給出部落格鏈結。某dalao的部落格 然後這道題的解法就是先用上下界費用流的建圖方式連早上和晚上之間的那條邊,保證當天一定會有r條或以上的餐巾可用。然後考慮買,快洗,慢洗和放起來的諸多情況。include include inclu...

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