[费用流][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位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
随机推荐
- scoping作用域,anonymous function匿名函数,built-in functions内置函数
作用域练习1 def test1(): print('in the test1') def test(): print('in the test') return test1 res = test() ...
- 为嵌入式mplayer移植添加ALSA音频驱动(全志V3s荔枝派zero)
首先准备mplayer和alsa_lib,我的是bulidroot添加后编译自动下载的,版本分别是alsa-lib-1.1.4.1和mplayer-1.3.0. 首先编译alsa_lib: ./con ...
- git与github区别与简介
From: https://blog.csdn.net/skyxmstar/article/details/65631658 git和github是两个完全不同的概念. git 是一个版本管理工具,是 ...
- python之路——8
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 学习内容 .1.文件操作 笔记.txt 1.文件路径:D:\python\Day8\笔记.txt 2.编码方 ...
- (整理)MySQL_REHL6.5 MySQL5.5 中文支持问题
1 查看字符集命令 SHOW VARIABLES LIKE ‘character%’; 2 修改my.cnf文件中来实现中文支持 2.1 复制my.cnf 安装结束后,etc目录下并没有my.cnf文 ...
- array 的方法
- Android Studio Fragment 无法获取 id的方法
在Fragment中,因为继承的父类的不同,导致在Fragment中无法获取到控件的id,此时,只要在获取findviewbyid前加上 getView()就可以了.
- SpringMVC - 运行流程图及原理分析
流程示意图: 代码分析图:
- python 对象转字典
从数据库中取出的数数据是 对象类型的,不能直接展示出来,需要转成字典类型,然后转成json 字符串,传给前端: data = {} data.update(obj.__dict__) print(da ...
- spark-1
先测试搭好的spark集群: 本地模式测试: 在spark的目录下: ./bin/run-example SparkPi 10 --master local[2] 验证成功: 集群模式 Spark S ...