題目鏈結點這裡
犯了個智障錯誤,,找錯找了一上午,,**。。
最小費用問題,,建模對於我這種菜雞有點難想到。。
大概這樣建模:
把第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 ...