線性規劃與網路流24 餐巾計畫問題

2021-07-26 08:34:51 字數 1310 閱讀 2810

題目鏈結點這裡

犯了個智障錯誤,,找錯找了一上午,,**。。

最小費用問題,,建模對於我這種菜雞有點難想到。。

大概這樣建模:

把第i天,分為2個點  xi和yi

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的邊。

然後,跑出了700多ms,,,在spfa裡面加了個slf優化,,瞬間降到300多ms,,可是最快的居然有20多ms,,但是**沒公開,不知道他是怎麼寫的。。。

#include#include#include#include#include#include#include#include#include#define mx 22222

#define inf 0x3f3f3f3f

#define mem(x,y) memset(x,y,sizeof(x))

#define fin freopen("input.txt","r",stdin)

using namespace std;

int n,p,m,f,n,s;

int head[mx],rear;

struct edge edge[1111111];

void edge_init()

void edge_add(int a,int b,int cap,int cost)

int dis[mx],pre[mx]; //儲存前驅頂點

bool vis[mx];

bool spfa(int s, int t) }}

}if (pre[t]==-1) return 0;

else return 1;

}//返回的是最大流, cost存的是最小費用

int mcmf(int s,int t,int &cost)

return flow;

}int main()

if(i+n<=n)

if(i!=n)edge_add(i,i+1,inf,0),edge_add(i+1,i,0,0);

}int cost;

mcmf(0,2*n+1,cost);

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

}return 0;

}

網路流24題10 餐巾計畫問題

最小費用最大流 建圖方式真麻煩 真是網路流裡的泥石流清流啊 老規矩 先建立超源點s和超匯點e 對於每一天 我們可以拆成2個點 乙個點稱為1號連線s 另外乙個稱為2號連線e 流量都是當天餐巾 費用0 由於我們可以不洗餐巾所以可以直接連線下一天 倆一號點連線 費用為0 流量inf 注意邊界 我們可以買餐...

網路流24題 13 餐巾計畫問題

寫網路流寫的頭昏腦漲qaq大概還是太菜了 比較有趣的建圖題 對於每乙個點拆點拆成早晨和晚上分別為 i 和 i 1.s i r,p 每天早晨可以買最多r條新餐巾 一條p分 2.s i r,0 每天用剩下r條髒餐巾 沒有代價 3.i t r,0 每天要用r條乾淨餐巾 沒有代價 4.i i m inf,f...

網路流24題10 餐巾計畫問題

題面戳我 題面描述 乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 fm 費用需s分 s輸出樣例 1 64說明 n 2000 ri 10000000 p,f,s 10000 ...