傳送門:
教練我想學數學建模。
網路流和最小費用流的題目不存在**難度,**不存在變形(目前來說是的,不知道是不是我沒做過對於模板修改的題目)
難度主要在於,你能看出來它是個網路流,並且還能正確的建模。
大喊一句,教練我想學數學建模!
這個題目建模不是很簡單。
首先,我們要知道乙個人可以修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...