BZOJ 1070 修车
Description
同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心。维修中心共有\(M\)位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这\(M\)位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
Input
第一行有两个\(m,n\),表示技术人员数与顾客数。 接下来\(n\)行,每行\(m\)个整数。第\(i+1\)行第\(j\)个数表示第\(j\)位技术人员维修第\(i\)辆车需要用的时间\(T_{j,i}\)。
Output
最小平均等待时间,答案精确到小数点后\(2\)位。
Sample Input
2 2
3 2
1 4
Sample Output
1.50
HINT
\((2 \le M \le 9,1 \le N \le 60), (1 \le T \le 1000)\)
这是一道比较明显的费用流题目。
这题构图很巧妙:
将每个工人拆成\(n\)个点,设第\(i\)个工人拆成的第\(j\)个点为\(P_{i,j}\),\(P_{i,j}\)表示第\(i\)个人倒数第\(j\)个修的车是哪一辆。
\(P_{i,j}\)向第\(k\)辆车连接一条容量为\(1\),费用为\(T_{i,k} \times j\)的边。
接着就是连接源汇点,最后跑最大费用最大流即可。
正确性也很明显。每个工人修的车只可以对它后面修的产生代价,而代价正好就是它的倒数名次与其时间的乘积。
zkw费用流是蒯的hzwer的,应该可以敲spfa吧。
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cstring>
using namespace std;
#define inf 0x7fffffff
#define T 601
using namespace std;
int n,m,cnt = 1,ans,t[61][10];
int d[605],q[605],from[605],head[605];
bool mark[605];
struct edge{int from,to,next,c,v;}e[100001];
inline int small(int a,int b) {if (a < b) return a; return b;}
void ins(int u,int v,int w,int c)
{
cnt++;
e[cnt].from = u; e[cnt].to = v;
e[cnt].next = head[u]; head[u] = cnt;
e[cnt].c = c; e[cnt].v = w;
}
void insert(int u,int v,int w,int c)
{
ins(u,v,w,c); ins(v,u,0,-c);
}
bool spfa()
{
memset(mark,0,sizeof(mark));
memset(d,0x7,sizeof(d));
d[T] = 0; mark[T] = 1;
queue <int> team;
team.push(T);
while (!team.empty())
{
int now = team.front();
team.pop();
for (int i = head[now];i;i = e[i].next)
if (e[i^1].v&&d[e[i].to] > d[now]-e[i].c)
{
d[e[i].to] = d[now]-e[i].c;
if (!mark[e[i].to])
{
mark[e[i].to] = true;
team.push(e[i].to);
}
}
mark[now] = false;
}
if (d[0] > 10000000) return false;
return true;
}
int dfs(int x,int f)
{
if (x == T)
{
mark[T] = 1;
return f;
}
int used = 0,w;
mark[x] = true;
for (int i = head[x];i;i = e[i].next)
if (!mark[e[i].to]&&e[i].v&&d[x]-e[i].c==d[e[i].to])
{
w = f - used;
w = dfs(e[i].to,small(e[i].v,w));
ans += w*e[i].c;
e[i].v -= w;
e[i^1].v += w;
used += w;
if (used == f) return f;
}
return used;
}
void zkw()
{
while (spfa())
{
mark[T] = 1;
while (mark[T])
{
memset(mark,0,sizeof(mark));
dfs(0,inf);
}
}
}
int main()
{
freopen("1070.in","r",stdin);
freopen("1070.out","w",stdout);
int i,j,k;
scanf("%d %d",&n,&m);
for (i = 1;i<=m;i++)
for (j = 1;j<=n;j++)
scanf("%d",t[i]+j);
for (i = 1;i<=n*m;i++)
insert(0,i,1,0);
for (int i = n*m+1;i<=n*m+m;i++)
insert(i,T,1,0);
for (i = 1;i<=n;i++)
for (j = 1;j<=m;j++)
for (k = 1;k<=m;k++)
insert((i-1)*m+j,n*m+k,1,t[k][i]*j);
zkw();
printf("%.2lf",(double)ans/m);
return 0;
}
BZOJ 1070 修车的更多相关文章
- BZOJ 1070 修车(最小费用流)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术 ...
- bzoj 1070 修车 —— 费用流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1070 需要考虑前面修的车对后面等待的车造成的时间增加: 其实可以从每个人修车的顺序考虑,如果 ...
- BZOJ 1070 修车 【费用流】
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- BZOJ 1070 修车(费用流)
如果能想到费用流,这道题就是显然了. 要求所有人的等待平均时间最小,也就是所有人的总等待时间最小. 每辆车只需要修一次,所以s连每辆车容量为1,费用为0的边. 现在需要把每个人拆成n个点,把车和每个人 ...
- [BZOJ 1070] [SCOI2007] 修车 【费用流】
题目链接:BZOJ - 1070 题目分析 首先想到拆点,把每个技术人员拆成 n 个点,从某个技术人员拆出的第 i 个点,向某辆车连边,表示这是这个技术人员修的倒数第 i 辆车.那么这一次修车对整个答 ...
- BZOJ 1070: [SCOI2007]修车 [最小费用最大流]
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4936 Solved: 2032[Submit][Status] ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- bzoj 1070 [SCOI2007]修车(最小费用最大流)
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3515 Solved: 1411[Submit][Status] ...
- 【BZOJ 1070】[SCOI2007]修车
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
随机推荐
- 6 Java学习之 枚举
1. 概念 枚举是一种规范,它规范了参数的形式,这样就可以不用考虑类型的不匹配,并且显示的替代了int型参数可能带来的模糊概念. 常用来定义一个final类型的变量(常量),保证输入安全.如 ...
- [置顶] Array ArrayList LinkList的区别剖析
这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...
- 应用层协议实现系列(一)——HTTPserver之仿nginx多进程和多路IO的实现
近期在尝试自己写一个Httpserver,在粗略研究了nginx的代码之后,决定仿照nginx中的部分设计自己实现一个高并发的HTTPserver,在这里分享给大家. 眼下使用的较多的Httpserv ...
- Cocos2d-x 3.0 红孩儿私家必修 - 第二章 cpp-empty-test
上一章我们讲到说曾经的HelloWorld演示更名为cpp-empty-test. 本章我们来分析一下 执行程序,我们能够看到熟悉的HelloWorld程序:与之前cocos2d-x2.x版本号的He ...
- Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏
一个程序要保持稳定运行必须要有异常处理,本文将简单介绍Python中的try-except..异常处理语句的使用. 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个 ...
- 经典SQL语句大全之基础
一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname 3.说明:备份sql server--- 创建 ...
- 解决Shockwave flash在chrome浏览器上崩溃的问题
越来越多的人開始使用chrome浏览器,非常多用户都遇到过flash崩溃的问题,有时候重新启动chrome能够解决,有时候会导致无法用chrome打开不论什么站点上的不论什么flash.这个问题非常少 ...
- 9.23 noip模拟试题
Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...
- HttpClient使用cookie
import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; ...
- session marked for kill处理oracle中杀不掉的锁
ora-00031:session marked for kill处理oracle中杀不掉的锁 一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长 ...