餐巾計畫問題

2021-07-28 19:45:41 字數 1424 閱讀 9883

乙個餐廳在相繼的n 天裡, 每天需用的餐巾數不盡相同。 假設第i天需要ri塊餐巾(i=1,2,…,n)。餐廳可以購買新的餐巾,每塊餐巾的費用

為p分;或者把舊餐巾送到快洗部,洗一塊需 m天,其費用為 f 分;或者送到慢洗部,洗一塊需 n 天(n>m),其費用為 s這道題是一道最小費用最大流的題目,然而有一些神犇寫的是dinic,速度碾壓眾人qaq

對於這道題,我們可以建立二分圖(xi

,yi )。

從源點到每個xi

、每個yi

到匯點均連一條容量為ri

、花費為0的邊;

從源點到每個yi

,連一條容量為inf、花費為p的邊;

對於每乙個xi

(i < n),連一條到xi

+ 1

、容量為inf、花費為0的邊;

對於每乙個xi

(i < n-m),連一條到yi

+ m

、容量為inf、花費為f的邊;

對於每乙個xi

(i < n-n),連一條到yi

+ n

、容量為inf、花費為s的邊。

跑最小費用最大流,得到結果即為答案。

這道題很有代表性,建出的二分圖雖然不像題目描述中那樣,但是其中從源點直接流向每個xi

這種等量替代的方法很值得學習。

code:

#include

#include

typedef

long

long ll;

const

int inf=1e9;

struct

queue

inline

void push(int n)

inline

int front()

inline

void pop()

inline

bool empty()

}q;struct edge

a[100000];

int head[20000];

int dis[20000];

int h[20000];

int f[20000];

int u[20000];

bool b[20000];

int n,x,num=1,s,t,c1,c2,c3,d1,d2;

inline

int min(int a,int b)

inline

int spfa(ll &x)

}if(dis[t]>inf) return

0; x+=u[t]*dis[t];

int p=t;

while(p!=s)

return1;}

inline ll mcmf()

int main()

餐巾計畫問題

乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f p 如m l時,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情況也如此。3 把餐巾送到慢洗部,洗一塊需n天 n m ...

餐巾計畫問題

餐巾計畫問題 time limit 1000 ms memory limit 65536 kb description 乙個餐廳在相繼的n 天裡,每天需用的餐巾數不盡相同。假設第i天需要ri塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為p分 或者把舊餐巾送到快洗部,洗一塊需m天,其費...

題解 餐巾計畫問題

傳送門 乙個餐廳在相繼的 nnn 天裡,每天需用的餐巾數不盡相同。假設第 iii 天需要 rir iri 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 ppp 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 nnn 天 n mn mn m ...