傳送門
題意:中文題。
solution:
因為這道題每個工人可以維修多個汽車,所以說沒法直接用費用流,我們先想乙個簡單的貪心思路:假如說我們考慮乙個工人的情況,那麼他修車所需的時間為: t1
+(t1
+t2)
+(t1
+t2+
t3)+
…+(t
1+…+
tn)
變形一下該式: n∗
t1+(
n−1)
∗t2+
…+tn
容易看出,我們修車的順序一定是從耗時小的開始,看到資料範圍是50,所以說我們可以試試拆點:乙個工人的維修情況可以看成多個只能維修一輛車的工人的維修情況,只不過他們各自需要1-n倍的時間,經過這次拆點,我們就可以把問題轉化成普通的費用流了。
這道題的建圖非常巧妙,同時也交給我們乙個技巧:當資料很小的時候,可以考慮多拆點。
**:
#include
#include
#include
using namespace std;
const int n=70;
int n,m,s,t;
int g[n][n];
int size=1;
struct edge[3
*n*n
*n];
intx,y,f,v;
int dis[n*n];
intq[2*n
*n*n];
int pre[n*n],prv[n*n];
bool vis[n*n];
int ansf,ansv;
int head[n*n];
int tt;
void add(int
x,int
y,int f,int v)
bool spfa()}}
}return (dis[t]!=1e9);
}int main()
add(i*n+j,t,1,0);
add(t,i*n+j,0,0);}}
ansv=0,ansf=0;
while (spfa())
printf("%.2f\n",1.0
*ansv/n);
}}
bzoj1070 修車)(費用流)
建圖重要。m個工人,n輛車 源點向每輛車連一條容量為1費用為0的邊。把每個工人拆成n個,第i個工人的第j個節點表示,第i個工人修倒數j輛車。每輛車向這n m個工人連一條容量為1費用為這個工人修這輛車的時間 這個工人倒數第幾個修這輛車。因為修一輛車只會使在它後面修的都 修這輛車的時間。我服了,爛費用流...
BZOJ 1070 修車 費用流
同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同 的車進行維修所用的時間是不同的。現在需要安排這m位技術人員所維修的車及順序,使得顧客平均等待的時間最 小。說明 顧客的等待時間是指從他把車送至維修中心到維修完畢所用的時間。第一行有兩個m,n,表示技術...
bzoj1070 修車 最小費用流
time limit 1 sec memory limit 128 mb submit 5655 solved 2383 submit status discuss 同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同 的車進行維修所用的時間是不同的。現...