最小費用流 洛谷P2053

2021-09-02 00:24:49 字數 1330 閱讀 9593

傳送門:

教練我想學數學建模。

網路流和最小費用流的題目不存在**難度,**不存在變形(目前來說是的,不知道是不是我沒做過對於模板修改的題目)

難度主要在於,你能看出來它是個網路流,並且還能正確的建模。

大喊一句,教練我想學數學建模!

這個題目建模不是很簡單。

首先,我們要知道乙個人可以修n輛車,那麼m個人就可以修n*m輛車車啦,但是每個人只能修一輛車,想要修下一輛就要排隊等待這一輛維修完畢。

那我們怎麼給它建模呢。

很顯然,如果有3個人想要找技術人員 j 修車,那麼第乙個人要等待t[1]的時間,第二個人需要等待t[1]+t[2]的時間,第三個人要等待t[1]+t[2]+t[3]的時間。那麼總的等待時間為t[1]+(t[1]+t[2])+(t[1]+t[2]+t[3]) = 3*t[1]+2*t[2]+t[3]。

所以我們把每個人拆成n個點,然後每個點連一條邊,容量為1,權值為k*w[i]。然後跑最小費用流就ok啦啦啦!

**在下面啦:

#include #define inf 0x3f3f3f3f

const int maxn= 2020;

using namespace std;

struct edge

;vectorg[maxn];

int dis[maxn];

int pv[maxn], pe[maxn];

int h[maxn];

void add_edge(int from, int to, int cap, int cost)

); g[to].push_back();

}void dijkstra(int s)

};memset(dis,inf,sizeof(dis));

dis[s] = 0;

priority_queueq;

q.push();

while (!q.empty()) );}}

}}pairmin_cost_max_flow(int s, int t) ;

for(int i=0;i>m>>n;

int tmp = 0;

int s = 0;

int t = n+n*m+1;

for(int i=1;i<=n;i++)

} }for(int i=1;i<=n;i++)

for(int i=n+1;iprintf("%.2lf\n",(double)min_cost_max_flow(s,t).second/(1.0*n));

return 0;

}

P2053 修車 網路流,費用流

n和m搞反調半天系列 又m個員工,n輛車,第j個員工修第i輛車需要t i j 的時間,求分配讓顧客平均等待時間最短。首先先假設乙個修車工要修1 w 1 w 個人,那麼對等待時間就要加上t 1 w t 2 w 1 t w 1 2 t w t 1 w t 2 w 1 t w 1 2 t w 那我們可以將...

最小費用流

include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...