[费用流][BZOJ1070]修车
修车
题目描述
同一时刻有位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
输入
第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时间T。
输出
最小平均等待时间,答案精确到小数点后2位。
样例输入
2 2
3 2
1 4
样例输出
1.50
提示
2<=M<=9,1<=N<=60 , 1<=T<=1000
又是一题看题解过的题...费用流难哇qaqq
对于每一个修车♂师傅,拆成N个点表示修N辆车
把车和所有的修车师傅拆成的N * M个点连边,记A[i, j]为第i个师傅修倒数第j辆车,流量为1(每辆车只能被修♂一次),费用为time[i , j] * k
关于费用:因为第j辆车在倒数第k个被修因此对全局产生的费用为time[i, j] * k (通俗的来说就是后面的人要排队啦w
S连每辆车,费用为0流量为1,每个师傅拆成的点连T,费用为0流量为1。
然后跑一遍MCMF结果除以k就好啦owo
代码:
#include<algorithm>
#include<cstdio>
#include<cstring> const int Maxv = , inf = 0x6ffffff, T = ;
int Next[Maxv], Head[Maxv], from[Maxv], tim[][], w[Maxv], v[Maxv], q[Maxv], d[Maxv], ans, cnt = , n, m;
bool inq[Maxv];
struct edge{
int from, to, next, c, v;
}e[]; int read(){
int x = , f = ;
char c = getchar();
while (c < '' || c > '') {
if (c == '-') {
f = -;
}
c = getchar();
}
while(c >= '' && c <= '') {
x = x * + c - '';
c = getchar();
}
return x * f;
} void Add(int u, int v, int w, int c) {
cnt++;
e[cnt].next = Head[u];
e[cnt].to = v;
e[cnt].from = u;
e[cnt].c = c;
e[cnt].v = w;
Head[u] = cnt;
} void Add_Edge(int u, int v, int w, int c) {
Add(u, v, w, c);
Add(v, u, , -c);
} bool spfa()
{
for (int i = ; i <= T; i++) {
d[i] = inf;
}
int t = , w = ;
d[] = ;
inq[] = true;
q[] = ;
while(t != w) {
int now = q[t];
t++;
if(t == T) {
t = ;
}
for (int i = Head[now]; i; i = e[i].next) {
if (e[i].v && d[e[i].to] > d[now] + e[i].c) {
d[e[i].to] = d[now] + e[i].c;
from[e[i].to] = i;
if (!inq[e[i].to]) {
inq[e[i].to] = true;
q[w++] = e[i].to;
if(w == T) {
w = ;
}
}
}
}
inq[now] = false;
}
if (d[T] == inf) {
return false;
}
return true;
} void mcf()
{
int x = inf;
for (int i = from[T]; i; i = from[e[i].from]) {
x = std::min(x, e[i].v);
}
for (int i = from[T]; i; i = from[e[i].from]) {
e[i].v -= x;
e[i ^ ].v += x;
ans += e[i].c * x;
}
} int main(){
n = read();
m = read();
for (int i = ; i <= m; i++) {
for (int j = ; j <= n; j++) {
tim[i][j] = read();
}
}
for (int i = ; i <= n * m; i++) {
Add_Edge(, i, , );
}
for (int i = n * m + ; i <= n * m + m; i++) {
Add_Edge(i, T, , );
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
for (int k = ; k <= m; k++) {
Add_Edge((i - ) * m + j, n * m + k, , tim[k][i] * j);
}
}
}
while (spfa()) {
mcf();
}
printf("%.2lf", (double)ans / m);
return ;
}
[费用流][BZOJ1070]修车的更多相关文章
- 【BZOJ1070】修车(费用流)
题意:同一时刻有N位车主带着他们的爱车来到了汽车维修中心. 维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. 现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- [SCOI2007][bzoj1070] 修车 [费用流]
题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...
- bzoj1070: [SCOI2007]修车(费用流)
1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...
- LG2053/BZOJ1070 「SCOI2007」修车 费用流
问题描述 LG2053 BZOJ1070 题解 将\(m\)个修理工拆为\(n \times m\)个,将修理工和车辆看做二分图,连出一个完全二分图. 边流量为\(1\),费用为时间,费用流即可. \ ...
- [bzoj1070][SCOI2007]修车——费用流
题目大意: 传送门 题解: 本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,<挑战程序设计竞赛>一 ...
- [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- 2018.10.13 bzoj1070: [SCOI2007]修车(费用流)
传送门 费用流经典题目. 自我感觉跟TheWindy′sThe Windy'sTheWindy′s很像. 利用费用提前计算的思想来建图就行了. 代码: #include<bits/stdc++. ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- BZOJ_1070_[SCOI2007]修车_费用流
BZOJ_1070_[SCOI2007]修车_费用流 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
随机推荐
- [蓝桥杯]PREV-8.历届试题_买不到的数目
问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 颗糖. 你可以 ...
- Ubuntu 16.04 LTS 常用快捷键
在Linux下Win键就是Super键 启动器 Win(长按) 打开启动器,显示快捷键 Win + Tab 通过启动器切换应用程序 Win + 1到9 与点击启动器上的图标效果一样 Win + Shi ...
- sqlserver 带输出参数的存储过程的创建与执行
创建 use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery4') drop proce ...
- 性能测试day05_Jmeter学习
今天来学习下jmeter这个性能测试工具,虽然说性能测试最主要的是整个性能的思路,但是也少不了工具的帮忙,从以前主流的LR到jmeter的兴起,不过对于性能测试来说,个人感觉jmeter比较适合接口性 ...
- File mapping
文件映射的三个功能: 1.File mapping allows the process to use both random input and output (I/O) and sequentia ...
- kubernets网络模式
参考:https://www.kubernetes.org.cn/2059.html
- SpringBoot 之jsp
Boot 内嵌的tomcat 是不支持jsp 的, jetty 也是. 虽然boot也是有默认配置一个InternalResourceViewResolver ,但是它并不像我们在springmvc ...
- 201772020113李清华《面向对象程序设计(java)》第一周学习总结
201772020113<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com b ...
- 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)
2. HotSpot虚拟机对象探秘 2.1 对象的创建 虚拟机遇到一条New指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初 ...
- java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.
https://www.cnblogs.com/spring87/p/7645625.html 今天我师父发现了一个问题:在更换登录页图片后,更新版本,部分手机打开会闪退.借了一个三星手机后,查看问题 ...