洛谷1251餐巾紙問題

2022-05-07 10:15:13 字數 1328 閱讀 9793

題目戳這裡

乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾(i=l,2,…,n)。餐廳可以從三種途徑獲得餐巾。

(1)購買新的餐巾,每塊需p分;

(2)把用過的餐巾送到快洗部,洗一塊需m天,費用需f分(f(3)把餐巾送到慢洗部,洗一塊需n天(n>m),費用需s分(s在每天結束時,餐廳必須決定多少塊用過的餐巾送到快洗部,多少塊送慢洗部。在每天開始時,餐廳必須決定是否購買新餐巾及多少,使洗好的和新購的餐巾之和滿足當天的需求量ri,並使n天總的費用最小

輸入格式:

輸入檔案共3行,第1行為總天數;第2行為每天所需的餐巾塊數;第3行為每塊餐巾的新購費用p,快洗所需天數m,快洗所需費用f,慢洗所需天數n,慢洗所需費用s。

輸出格式:

輸出檔案共1行為最小的費用。

輸入樣例#1: 複製

3

3 2 4

10 1 6 2 3

輸出樣例#1: 複製

64

n<=2000

ri<=10000000

p,f,s<=10000

時限4s

學習了一下zkw費用流,大概就是用dinic跑費用流,,快的飛起  

建圖還很麻煩。把每天拆成ai,bi兩點,ai表示用過的,bi沒用過。建立超級源匯s,t。

(1)s向ai連容量r[i],費用0的邊,s向bi連容量r[i],費用p的邊

(2)bi向t連容量r[i],費用0的邊

(3)ai向b(i+m)連容量無窮,費用f的邊,ai向b(i+n)連容量無窮,費用f的邊,ai向a(i+1)連容量無窮費用0的邊

然後zkw 50ms過了

#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

#define n 2005

using namespace std;

int day,n,m,p,s,f,s,t,tot,r[n],cur[n<<1],hd[n<<1],vis[n<<1],d[n<<1];

ll cost;

struct edgee[n<<4];

void adde(int u,int v,int w,int c)

bool spfa()}}

return d[s]<0x3f3f3f3f;

}int dfs(int u,int a)

}vis[u]=0;return fl;

}int main()

while(spfa())

printf("%lld",cost);

return 0;

}

洛谷 1251 餐巾計畫問題

題鏈 題解 一點啟示 建圖時要考慮到流量問題,即為了方便使用最小費用最大流演算法,要把流量最大時為最終目的考慮進建圖。拆點,每天拆為兩個點i,i 表示每天開始和每天結束 s,i,ai,p 在第i天最多買ri個餐巾,花費為p i,t,ai,0 第i天要用ai塊餐巾 s,i ai,0 第i天用剩的ai塊...

洛谷 P1251 餐巾計畫問題

吃什麼 先說建圖 經典構圖題。將每一天拆成兩個點i,i 加如下6條邊 s i,r i,p 在第 i 天可以買至多ri 個餐巾,每塊 p 分 i t,r i,0 第i 天要用ri 塊餐巾 s i ri,0 第 i 天用剩的ri 塊舊餐巾 i i m,f 第 i 天的舊餐巾送到快洗部,每塊 f分 i i...

洛谷 1251 餐巾計畫問題 費用流SPFA

題目鏈結 每一天的餐巾需求相當於必須遍歷某些點若干次 設q i 為dayi需求量 x,y 表示邊x容y費 將每個點i拆成i,i 由i t連 q i 0 的邊,表示求最大流的話一定要流滿q i 對於i,由s i連 q i 0 的邊,表示滿足dayi需求後最多還能給出q i 塊餐巾 感覺inf好像als...