bzoj1070 修車 最小費用流

2021-08-01 11:39:24 字數 2407 閱讀 6898

time limit: 1 sec  

memory limit: 128 mb

submit: 5655  

solved: 2383 [

submit][

status][

discuss]

同一時刻有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)

題目思路:

首先分析問題,最終狀態應該是把來修車的n個人分成m隊,也就是每個修車師傅面前排一隊人,其中這個隊裡的第k個人等待時間是k*這個人在該技術工人這裡修車的時間t;

那麼,也就是說把這n個人分配到m個隊中的某個位置上,每個人只分配一次,每個位置只有乙個人。

因此,可以用網路流來解決。圖中共有1個源點,1個匯點,n個節點代表n個人(人節點 ),n*m個節點代表每個佇列中的每個位置(位置節點)。從源點向每個人節點連一條容量為1,費用是0的邊;從每個人節點向每個位置節點連一條邊,容量為1,費用是這個人站在這個佇列的這個位置時的花費;每個位置節點向匯點連一條容量是1,費用是0的邊。跑一遍源點到匯點的最小費用最大流得到答案。

看了一下status,速度差距明顯,查了一下網上題解的做法,認為有必要學一下zkw費用流。

#pragma warning(disable:4786)

#pragma comment(linker, "/stack:102400000,102400000")

#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define for(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)

#define mem(a,x) memset(a,x,sizeof(a))

#define lson l,m,x<<1

#define rson m+1,r,x<<1|1

using namespace std;

const int inf = 0x3f3f3f3f;

const int mod = 1e9 + 7;

const double pi = acos(-1.0);

const double eps=1e-6;

const int maxn = 700;

int c[65][15];

struct edge

;struct mcmf

void addedge(int from , int to , int cap , int cost);

edge e2 = ;

edges.push_back(e1);

edges.push_back(e2);

int m = edges.size();

g[from].push_back(m - 2);

g[to].push_back(m - 1);

}bool bellmanford(int s , int t , int & flow , ll & cost)}}

}if(d[t] == inf) return false;

flow += a[t];

cost += (ll)a[t] * (ll)d[t];

int u = t;

while(u != s)

return true;

}ll mincost(int s , int t , int & flow)

}g;int main()

}g.init(2 + n * m + n);

int source = 1 , sink = 2 + n * m + n;

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

for(int j = 1 ; j <= m ; j++)

}int flow ;

double ans = (double)g.mincost(source , sink , flow);

ans = ans / n;

printf("%.2lf\n" , ans);

}return 0;

}

bzoj1070 修車)(費用流)

建圖重要。m個工人,n輛車 源點向每輛車連一條容量為1費用為0的邊。把每個工人拆成n個,第i個工人的第j個節點表示,第i個工人修倒數j輛車。每輛車向這n m個工人連一條容量為1費用為這個工人修這輛車的時間 這個工人倒數第幾個修這輛車。因為修一輛車只會使在它後面修的都 修這輛車的時間。我服了,爛費用流...

BZOJ 1070 修車 費用流

同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同 的車進行維修所用的時間是不同的。現在需要安排這m位技術人員所維修的車及順序,使得顧客平均等待的時間最 小。說明 顧客的等待時間是指從他把車送至維修中心到維修完畢所用的時間。第一行有兩個m,n,表示技術...

BZOJ 1070 修車 神奇網路流

傳送門 題意 中文題。solution 因為這道題每個工人可以維修多個汽車,所以說沒法直接用費用流,我們先想乙個簡單的貪心思路 假如說我們考慮乙個工人的情況,那麼他修車所需的時間為 t1 t1 t2 t1 t2 t3 t 1 tn 變形一下該式 n t1 n 1 t2 tn 容易看出,我們修車的順序...