[费用流][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位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
随机推荐
- SpringSecurity-ExceptionTranslationFilter的作用
ExceptionTranslationFilter捕获异常并做相应的处理.处理逻辑如下: 1.首先判断是不是SpringSecurity产生的异常,如果是将在handleSpringSecurity ...
- maven打包时报错:-source 1.5 中不支持 diamond 运算符
报错现象: 解决方法: 在pom文件中加入下面依赖 <build> <plugins> <plugin> <groupId>org.apache.mav ...
- 知识点:图说 Mysql 权限管理
图: #授权表 user #该表放行的权限,针对:所有数据,所有库下所有表,以及表下的所有字段 db #该表放行的权限,针对:某一数据库,该数据库下的所有表,以及表下的所有字段 tables_priv ...
- 浅析MySQL中concat以及group_concat的使用
说明: 本文中使用的例子均在下面的数据库表tt2下执行: 一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接 ...
- android 开发 View _8_ 动态图片自定义View
转载地址:https://blog.csdn.net/mengks1987/article/details/77770922 先来看下效果: 是不是有一种熟悉感,其实这种效果使用序列帧动画也是可以实现 ...
- list按照某个元素进行排序
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...
- 再谈PHP设计模式
设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法. 单例模式 $_instance必须声明为静态的私有变量 构造函数和析构函数必须声 ...
- RK3288 mipi屏参数配置文件
RK3288 Android 5.1系统 Linux 3.10 mipi屏参数配置文件所在的路径:kernel/arch/arm/boot/dts/xxx_mipi.dtsi 屏参数配 ...
- ecs主机被破解后下载的执行文件的脚本
#!/bin/bashchmod 777 xiaochattr 777 haha/etc/init.d/iptables stop;service iptables stop;SuSEfirewall ...
- 关于Encode in UTF-8 without BOM
定义BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码.它的编码是FEFF. 说明 在 UTF-8 文件中放置 BOM ...