1070: [SCOI2007]修车 - BZOJ
Description
同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
Input
第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时间T。
Output
最小平均等待时间,答案精确到小数点后2位。
Sample Input
2 2
3 2
1 4
Sample Output
1.50
HINT
数据范围: (2<=M<=9,1<=N<=60), (1<=T<=1000)
费用流建图,把m个人每个人拆成n个点,表示的是第m个人倒数第i个修这个车,那么费用就是i*时间
没想到zkw费用流模板打错了
在dfs过程里
我是这么写的
- function dfs(x,flow:longint):longint;
- var
- i,d,min:longint;
- begin
- flag[x]:=time;
- if x=t then
- begin
- inc(ans,flow*dis[t]);
- exit(flow);
- end;
- i:=first[x];
- dfs:=;
- while i<> do
- begin
- d:=dis[x]+w[i]-dis[last[i]];
- min:=flow;
- if min>liu[i] then min:=liu[i];
- if (liu[i]>) and (d<f[last[i]]) then f[last[i]]:=d;
- if (d=) and (flag[last[i]]<>time) and (min>) then
- begin
- d:=dfs(last[i],min);
- dec(flow,d);
- inc(dfs,d);
- inc(liu[i xor ],d);
- dec(liu[i],d);
- end;
- if flow= then break;
- i:=next[i];
- end;
- end;
但是应该这么写
- function dfs(x,flow:longint):longint;
- var
- i,d,min:longint;
- begin
- if x=t then
- begin
- inc(ans,flow*dis[t]);
- exit(flow);
- end;
- i:=first[x];
- flag[x]:=time;
- dfs:=;
- while i<> do
- begin
- d:=dis[x]+w[i]-dis[last[i]];
- min:=flow;
- if min>liu[i] then min:=liu[i];
- if (liu[i]>) and (d<f[last[i]]) then f[last[i]]:=d;
- if (d=) and (flag[last[i]]<>time) and (min>) then
- begin
- d:=dfs(last[i],min);
- dec(flow,d);
- inc(dfs,d);
- inc(liu[i xor ],d);
- dec(liu[i],d);
- end;
- if flow= then break;
- i:=next[i];
- end;
- end;
应该先判断是否走到了汇点,再做标记,如果不这样的话,就无法多路增广了,即只能到达汇点一次,然后他会立即增加dis,这个时候dis就是错的了(因为较小的那个dis还没有增广完全)
对于其他的点,都是增广到不能再增广,所以没有问题,只要访问一次就行了(应该是这样的吧)
写了几遍了,连这个都没有发现,唉~~~~
- const
- maxn=;
- maxm=;
- inf=;
- var
- n,m,tot,s,t,ans,time:longint;
- first,f,dis,flag:array[..maxn*maxm]of longint;
- last,next,w,liu:array[..maxn*maxn*maxm*maxm]of longint;
- procedure insert(x,y,f,ww:longint);
- begin
- inc(tot);
- last[tot]:=y;
- next[tot]:=first[x];
- first[x]:=tot;
- w[tot]:=ww;
- liu[tot]:=f;
- end;
- procedure init;
- var
- i,j,k,x:longint;
- begin
- read(m,n);
- tot:=;
- s:=;
- t:=n*m+n+;
- for i:= to n do
- for j:= to m do
- begin
- read(x);
- for k:= to n do
- begin
- insert((j-)*n+k,n*m+i,,x*k);
- insert(n*m+i,(j-)*n+k,,-x*k);
- end;
- end;
- for i:= to n*m do
- begin
- insert(s,i,,);
- insert(i,s,,);
- end;
- for i:= to n do
- begin
- insert(n*m+i,t,,);
- insert(t,n*m+i,,);
- end;
- end;
- function dfs(x,flow:longint):longint;
- var
- i,d,min:longint;
- begin
- if x=t then
- begin
- inc(ans,flow*dis[t]);
- exit(flow);
- end;
- i:=first[x];
- flag[x]:=time;
- dfs:=;
- while i<> do
- begin
- d:=dis[x]+w[i]-dis[last[i]];
- min:=flow;
- if min>liu[i] then min:=liu[i];
- if (liu[i]>) and (d<f[last[i]]) then f[last[i]]:=d;
- if (d=) and (flag[last[i]]<>time) and (min>) then
- begin
- d:=dfs(last[i],min);
- dec(flow,d);
- inc(dfs,d);
- inc(liu[i xor ],d);
- dec(liu[i],d);
- end;
- if flow= then break;
- i:=next[i];
- end;
- end;
- procedure work;
- var
- del,i:longint;
- begin
- while true do
- begin
- for i:=s to t do
- f[i]:=inf;
- inc(time);
- dfs(s,inf);
- del:=inf;
- for i:=s to t do
- if (flag[i]<>time) and (f[i]<del) then del:=f[i];
- if del=inf then break;
- for i:=s to t do
- if flag[i]<>time then inc(dis[i],del);
- end;
- writeln(ans/n::);
- end;
- begin
- init;
- work;
- end.
1070: [SCOI2007]修车 - BZOJ的更多相关文章
- BZOJ 1070: [SCOI2007]修车 [最小费用最大流]
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4936 Solved: 2032[Submit][Status] ...
- 【BZOJ】1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...
- 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] ...
- 1070: [SCOI2007]修车
1070: [SCOI2007]修车 https://www.lydsy.com/JudgeOnline/problem.php?id=1070 分析: 每个第几次修车等的时间都不一样,当前第i个人修 ...
- [BZOJ 1070] [SCOI2007] 修车 【费用流】
题目链接:BZOJ - 1070 题目分析 首先想到拆点,把每个技术人员拆成 n 个点,从某个技术人员拆出的第 i 个点,向某辆车连边,表示这是这个技术人员修的倒数第 i 辆车.那么这一次修车对整个答 ...
- 【BZOJ】1070: [SCOI2007]修车(费用流+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 好神的题!!!orz 首先我是sb不会拆点..... 首先,每一个技术人员维修车辆都有一个先后 ...
- BZOJ 1070: [SCOI2007]修车(费用流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...
- bzoj 1070 [SCOI2007]修车——网络流(拆边)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1070 后面还有几辆车在这个人这儿修,自己这辆车的时间对总时间的贡献就要多乘上几倍. 所以可以 ...
随机推荐
- 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象
一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象 ...
- php读取目录下的文件
工作需要写了一个读取指定目录下的文件,并显示列表,点击之后读取文件中的内容 高手拍砖,目录可以自由指定,我这里直接写的是获取当前文件目录下面的所有文件 <?php /** * 读取指定目录下面的 ...
- MVC自定义错误页404静态页
昨天公司要求给所有项目添加自定义404错误页,具体的要求实现的有以下几点: 1.实现自定义错误(如各种error,404等)跳转到指定的页面 2.所指定的页面输出的http状态值必须是404或其他指定 ...
- asp.net中URL参数传值中文乱码的三种解决办法
在做Asp.Net开发的时候,参数传递中文时,经常会遇到页面乱码的问题,下面是在网上收集的相关资料,请大家参考: 解决的方法一般有3种: 1.设置web.config文件 <system.web ...
- [老老实实学WCF] 第八篇 实例化
老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...
- 20150323--MVC
MVC: Model view(视图层,模板) Control(控制层) 三层:数据访问,商业逻辑,用户界面(Webform,MVC). 服务端无状态:接受请求,返回页面,每次请求并返回界面,前后不是 ...
- UI2_IOS坐标系
// // AppDelegate.m // UI2_IOS坐标系 // // Created by zhangxueming on 15/6/29. // Copyright (c) 2015年 z ...
- JS学习第二课
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [javascript|基本概念|Underfined]学习笔记
Underfined类型的值:underfined(只有一个) 1/声明未初始化 e.g.:var msg;-->msg == underfined:true 2/申明并值初始化为underfi ...
- CSS伪对象选择符整理
1.E::selection 2.E::placeholder 1. E::selection 设置对象被选择时的样式. 需要注意的是,::selection只能定义被选择时的background-c ...