nefu488餐廳計畫問題(最小費用最大流)

2021-06-10 02:18:01 字數 1614 閱讀 2928

餐廳計畫問題

乙個餐廳在相繼的n 天裡,每天需用的餐巾數不盡相同。假設第i天需要ri塊餐巾(i=1,2,…,n)。餐廳可以購買新的餐巾,每塊餐巾的費用為p分;或者把舊餐巾送到快洗部,洗一塊需m天,其費用為f 分;或者送到慢洗部,洗一塊需n 天(n > m),其費用為s < f 分。每天結束時,餐廳必須決定將多少塊髒的餐巾送到快洗部,多少塊餐巾送到慢洗部,以及多少塊儲存起來延期送洗。但是每天洗好的餐巾和購買的新餐巾數之和,要滿足當天的需求量。

試設計乙個演算法為餐廳合理地安排好n 天中餐巾使用計畫,使總的花費最小。

程式設計找出乙個最佳餐巾使用計畫.

求出最小花費。

【問題分析】

網路優化問題,用最小費用最大流解決。

【建模方法】

把每天分為二分圖兩個集合中的頂點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)連一條容量為無窮大,費用為0的有向邊。

5、從每個xi向yi+m(i+m<=n)連一條容量為無窮大,費用為f的有向邊。

6、從每個xi向yi+n(i+n<=n)連一條容量為無窮大,費用為s的有向邊。

求網路最小費用最大流,費用流值就是要求的最小總花費。

【建模分析】

這個問題的主要約束條件是每天的餐巾夠用,而餐巾的**可能是最新購買,也可能是前幾天送洗,今天剛剛洗好的餐巾。每天用完的餐巾可以選擇送到快洗部或慢洗部,或者留到下一天再處理。

經過分析可以把每天要用的和用完的分離開處理,建模後就是二分圖。二分圖x集合中頂點xi表示第i天用完的餐巾,其數量為ri,所以從s向xi連線容量為ri的邊作為限制。y集合中每個點yi則是第i天需要的餐巾,數量為ri,與t連線的邊容量作為限制。每天用完的餐巾可以選擇留到下一天(xi->xi+1),不需要花費,送到快洗部(xi->yi+m),費用為f,送到慢洗部(xi->yi+n),費用為s。每天需要的餐巾除了剛剛洗好的餐巾,還可能是新購買的(s->yi),費用為p。

在網路上求出的最小費用最大流,滿足了問題的約束條件(因為在這個圖上最大流一定可以使與t連線的邊全部滿流,其他邊只要有可行流就滿足條件),而且還可以保證總費用最小,就是我們的優化目標。

#includeusing namespace std;

const int mm=111111;

const int mn=2222;

const int oo=1000000000;

int node,src,dest,edge;

int reach[mm],flow[mm],cost[mm],next[mm];

int head[mn],dis[mn],q[mn],p[mn];

bool vis[mn];

inline int min(int a,int b)

return p[dest]>=0;

}int spfaflow()

return ans;

}int main()

printf("%d\n",spfaflow());

}return 0;

}

FZU 2086 餐廳點餐

本週周測就做了三道水題 因為時間問題,考試的時候沒有看 jack要點餐,他點餐有很多種套路,然後問你到底有多少種方法點餐。1 2 2 2 2 2 2 33 1 5 21 4 3 65 8 他會點1 2道葷菜,1 2道素菜。所以先分配葷素搭配有四種情況。可以優化比較min,max然後去掉 然後心情好的...

FZU 2086 餐廳點餐(列舉)

題意 有a種湯,b種飯,c種麵條,d種葷菜,e種素菜。jack每頓飯都會點1 2樣葷菜d,1 2樣素菜e 不重複 同時,在jack心情好的時候,會點一樣飯b,再配上一種湯a。在心情不好的時候,就只吃一種麵條c。總價在min max之間。jack想知道,總共有多少種不同的點餐方案。思路 暴力列舉 in...

P1251餐廳計畫問題(最小費用最大流)

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