BZOJ 1070 修車 費用流

2022-02-27 23:42:56 字數 1785 閱讀 1093

同一時刻有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 容易看出,我們修車的順序...