同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同
的車進行維修所用的時間是不同的。現在需要安排這m位技術人員所維修的車及順序,使得顧客平均等待的時間最
小。 說明:顧客的等待時間是指從他把車送至維修中心到維修完畢所用的時間。
第一行有兩個m,n,表示技術人員數與顧客數。 接下來n行,每行m個整數。第i+1行第j個數表示第j位技術人
員維修第i輛車需要用的時間t。
最小平均等待時間,答案精確到小數點後2位。
2 23 2
1 41.50
資料範圍: (2<=m<=9,1<=n<=60), (1<=t<=1000)
這道題需要我們將顧客與工人匹配,容易想到費用流
我們源點s從顧客流入,通過一條路徑到達t,使這條路徑上累加的費用就是總的等待時間。
問題是我們怎麼構圖。
我們想,不讓工人去找顧客,讓顧客去找工人,對於同乙個工人,如果他總共要給x個顧客修車,那麼對於第乙個顧客,就有x個人要等,沒錯吧。第二個顧客就有x - 1個人要等
由這樣的思想,我們拆工人,拆成m * n個,每個表示倒數第i次修車的工人,讓每個顧客朝他們連邊,權值為i * t,i表示這是倒數第i次,要有i個人等
所有邊的流量都是1,剩餘邊的費用為0
跑一遍費用流就出來了
#include#include#include#include#include#define ll long long int#define rep(i,n) for (int i = 1; i <= (n); i++)
#define fo(i,x,y) for (int i = (x); i <= (y); i++)
#define redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 1005,maxm = 1000005,inf = 0x3f3f3f3f;
inline ll read()
while (c >= 48 && c <= 57)
return out * flag;
}ll m,n;
int head[maxn],nedge = 0;
struct edgeedge[maxm];
inline void build(int u,int v,ll f,ll w);
head[u] = nedge++;
edge[nedge] = (edge) ;
head[v] = nedge++;
}ll pre[maxn],d[maxn],s,t;
bool inq[maxn];
ll cost = 0;
inline void maxflow()}}
} if (d[t] == inf) break;
ll flow = inf; u = t;
while (u != s)
cost += flow * d[t];
u = t;
while (u != s) }}
int main()
} for (int i = 1; i <= n; i++)
for (int k = 1; k <= m; k++)
build(s,i * m + k,1,0);
maxflow();
printf("%.2lf\n",(double) cost / m);
return 0;
}
bzoj1070 修車)(費用流)
建圖重要。m個工人,n輛車 源點向每輛車連一條容量為1費用為0的邊。把每個工人拆成n個,第i個工人的第j個節點表示,第i個工人修倒數j輛車。每輛車向這n m個工人連一條容量為1費用為這個工人修這輛車的時間 這個工人倒數第幾個修這輛車。因為修一輛車只會使在它後面修的都 修這輛車的時間。我服了,爛費用流...
bzoj1070 修車 最小費用流
time limit 1 sec memory limit 128 mb submit 5655 solved 2383 submit status discuss 同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同 的車進行維修所用的時間是不同的。現...
BZOJ 1070 修車 神奇網路流
傳送門 題意 中文題。solution 因為這道題每個工人可以維修多個汽車,所以說沒法直接用費用流,我們先想乙個簡單的貪心思路 假如說我們考慮乙個工人的情況,那麼他修車所需的時間為 t1 t1 t2 t1 t2 t3 t 1 tn 變形一下該式 n t1 n 1 t2 tn 容易看出,我們修車的順序...