學術篇 網路流24題 餐巾計畫問題

2021-07-26 14:47:16 字數 1448 閱讀 8737

傳送門:luogu2776 餐巾計畫問題

挑戰之傳送門:luogu1251 餐巾

這題非常經典啊。。不過還是要吐槽一下luogu1251喪心病狂的資料,我3s竟然tle了,我覺得得花式壓壓常了,但是在luogu2776a了,本蒟蒻就勉強貼過來了。

(更新:luogu大牛分站提交自帶o2,於是就過了~~)

題目大意你們點傳送門進去看就好。。

這題分析一下就能很清晰地看出是最小費用最大流啊,不過建圖比較有講究。。

要建兩排點,一排代表舊餐巾

,一排代表新餐巾,然後分情況建邊(*):

1)從s向每個xi建一條容量為∞,費用為0的邊做限制;

2)從每個yi向t建一條容量為ri,費用為0的邊,表示每天要用ri的餐巾;

3)從s向每個yi建一條容量為∞,費用為p的邊,表示買餐巾;

4)從每個xi向xi+1建一條容量為∞,費用為0的邊,表示延時送洗;

5)從每個xi向yi+m建一條容量為∞,費用為s的邊,表示快洗;

6)從每個xi向yi+n建一條容量為∞,費用為t的邊,表示慢洗。

*變數說明:

s-源點 

xi-第i天的舊餐巾 yi-第i天的新餐巾 t-匯點 p-每張餐巾的費用 m-快洗的天數 s-快洗的費用 n-慢洗的天數 t-慢洗的費用

然後裸跑費用流就行了……我直接上板子,結果t了是什麼鬼。。

個人認為以上建邊中的1)不是很好理解。。開始的時候覺得是新餐巾用完之後要建一條向xi的邊,結果連樣例都過不了……桑心。不過自己畫畫圖手玩以下就發現這樣搞退流什麼的就會出現問題,所以要像1)那樣建。。

以下是**:

//開發環境:dev-c++ 5.11

#include #include #include #define maxv 2005

#define maxe 500005

#define gc getchar

#define cl(a,b) memset(a,b,sizeof(a))

#define min(a,b) (a>1];

int s,t,tot=1;

ll flow=0,cost=0;

void qin(int &a)

void build(int x,int y,int z,int zz)

bool spfa(ll &flow,ll &cost)

}if(d[t]==0x7f7f7f7f) return 0;

flow+=a[t]; cost+=a[t]*d[t];

for(int i=t;i-s;i=e[p[i]^1].to)

e[p[i]].flow+=a[t],e[p[i]^1].flow-=a[t];

return 1;

}int main()

while(spfa(flow,cost));

printf("%lld",cost);

}

網路流24題 餐巾計畫問題

傳送門 這個題我一開始沒把tot賦值成 1,然後調了1h。然後只拿了20,看了題解才知道漏了一種情況,那就是其實餐巾是可以留到第二天的。然後就沒了。對了,忘說做法了 尷尬 其實就是拆點,分別連邊,實現題目中的三種操作,具體可以看我的 include include include include i...

網路流24題餐巾計畫問題

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

網路流24題 餐巾計畫問題

一道建模稍微有難度的網路流,首先你需要考慮到拆點,確實有點難度,你需要把一天拆成乾淨餐巾和骯髒餐巾,因為髒餐巾是可以轉化為乾淨餐巾的,你需要做到這個過程,所以你需要拆點,其次難想到的應該是如何解決快洗部和慢洗部每次只能洗一件並且需要洗多天,如何安排哪天的餐巾去洗就是個問題,所以可以考慮每天的餐巾都可...