【BZOJ1070】修车(费用流)
题意:同一时刻有N位车主带着他们的爱车来到了汽车维修中心。
维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。
现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。
说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
数据范围: (2<=M<=9,1<=N<=60), (1<=T<=1000)
题意:RYZ作业
费用流经典模型之一
对于一次修车我们有三个属性,车的编号,人的编号,以及它是这个人倒数第几个修的车
为什么不是正数第几个?因为不知道每个人各自要修多少辆,这样就无法统计它让后面的车主等待的时间
而对于倒数第K修的车,它让后面以及当前的的车主多等待了a[i,j]*k的时间
将人裂点,(i,j)表示这是第i个人修的倒数第j辆车
源点连车,容量为1,费用为0
车连人裂的点,容量为1,费用为a[i,j]*k
人裂的点连汇点,容量为1,费用为0
- var head,vet,next,len1,len2,dis,fan:array[..]of longint;
- inq:array[..]of boolean;
- pre:array[..,..]of longint;
- q:array[..]of longint;
- a,num:array[..,..]of longint;
- n,m,i,j,k,tot,src,source,s:longint;
- ans:double;
- function min(x,y:longint):longint;
- begin
- if x<y then exit(x);
- exit(y);
- end;
- procedure add(a,b,c,d:longint);
- begin
- //writeln(a,' ',b,' ',c,' ',d);
- inc(tot);
- next[tot]:=head[a];
- vet[tot]:=b;
- len1[tot]:=c;
- len2[tot]:=d;
- head[a]:=tot;
- inc(tot);
- next[tot]:=head[b];
- vet[tot]:=a;
- len1[tot]:=;
- len2[tot]:=-d;
- head[b]:=tot;
- end;
- function spfa:boolean;
- var u,e,v,i,t,w:longint;
- begin
- for i:= to s do
- begin
- dis[i]:=maxlongint>>;
- inq[i]:=false;
- end;
- t:=; w:=; q[]:=source; dis[source]:=; inq[source]:=true;
- while t<w do
- begin
- inc(t); u:=q[t mod ];
- inq[u]:=false;
- e:=head[u];
- while e<> do
- begin
- v:=vet[e];
- if (len1[e]>)and(dis[u]+len2[e]<dis[v]) then
- begin
- pre[v,]:=u;
- pre[v,]:=e;
- dis[v]:=dis[u]+len2[e];
- if not inq[v] then
- begin
- inc(w); q[w mod ]:=v; inq[v]:=true;
- end;
- end;
- e:=next[e];
- end;
- end;
- if dis[src]=maxlongint>> then exit(false);
- exit(true);
- end;
- procedure mcf;
- var k,e,t:longint;
- begin
- k:=src; t:=maxlongint;
- while k<>source do
- begin
- t:=min(t,len1[pre[k,]]);
- k:=pre[k,];
- end;
- k:=src;
- while k<>source do
- begin
- e:=pre[k,];
- len1[e]:=len1[e]-t;
- len1[fan[e]]:=len1[fan[e]]+t;
- ans:=ans+t*len2[e];
- k:=pre[k,];
- end;
- end;
- begin
- assign(input,'bzoj1070.in'); reset(input);
- assign(output,'bzoj1070.out'); rewrite(output);
- readln(m,n);
- for i:= to do
- if i and = then fan[i]:=i+
- else fan[i]:=i-;
- for i:= to n do
- for j:= to m do read(a[i,j]);
- s:=n;
- for i:= to m do
- for j:= to n do
- begin
- inc(s); num[i,j]:=s;
- end;
- inc(s); source:=s;
- inc(s); src:=s;
- for i:= to n do add(source,i,,);
- for i:= to n do
- for j:= to m do
- for k:= to n do add(i,num[j,k],,a[i,j]*k);
- for i:= to m do
- for j:= to n do add(num[i,j],src,,);
- while spfa do mcf;
- writeln(ans/n::);
- close(input);
- close(output);
- end.
【BZOJ1070】修车(费用流)的更多相关文章
- [SCOI2007][bzoj1070] 修车 [费用流]
题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...
- 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位技术人员所维修的车及顺序,使 ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- P2053 [SCOI2007]修车 费用流
$ \color{#0066ff}{ 题目描述 }$ 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M ...
- bzoj 1070 修车 —— 费用流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1070 需要考虑前面修的车对后面等待的车造成的时间增加: 其实可以从每个人修车的顺序考虑,如果 ...
- BZOJ 1070 修车(费用流)
如果能想到费用流,这道题就是显然了. 要求所有人的等待平均时间最小,也就是所有人的总等待时间最小. 每辆车只需要修一次,所以s连每辆车容量为1,费用为0的边. 现在需要把每个人拆成n个点,把车和每个人 ...
- 【BZOJ 1070】[SCOI2007]修车 费用流
就是拆个点限制一下(两点一排一大片),这道题让我注意到了限制这个重要的词.我们跑网络流跑出来的图都是有一定意义的,一般这个意义就对应了问题的一种方案,一般情况下跑一个不知道对不对的方案是相对容易的我们 ...
- 【BZOJ1070】[SCOI2007]修车 费用流
[BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...
随机推荐
- 转】RDD与DataFrame的转换
原博文出自于: http://www.cnblogs.com/namhwik/p/5967910.html RDD与DataFrame转换1. 通过反射的方式来推断RDD元素中的元数据.因为RDD本身 ...
- npm安装淘宝镜像cnpm报错npm ERR! errno -4048
今天在安装淘宝镜像的时候报错了,第一次遇上,表示很懵逼 然后捣腾了半天以为是npm install 的时候出错,后来网上查到是 装淘宝镜像cnpm的时候报错,好像是权限问题,解决方法: npm ca ...
- SQL将查询出来的多列的值拼接成一个字符串
-- 单列拼接,先查出一行,再加上逗号,接着拼接 查出的下一行 SELECT GROUP_CONCAT(user_id) FROM user; -- result 160,160,160,196 -- ...
- SQL Server性能调优——报表数据库与业务数据库分离
前段时间把公司的主数据库切了,分成业务库和报表库,业务库向报表库进行实时的Replication.这个项目的上线提升了系统的性能和可维护性,现在把设计时的考量和所做的工作重新回顾一下,作为备忘. 项目 ...
- vue获取dom元素高度的方法
获取高度: <div ref="自定义名称" > </div>要在钩子mounted里面dom结构生成后去获取dom的高度,宽度,修改样式等操作!!! mo ...
- js添加千位分隔符
function thousandBitSeparator(num){ var re=/\d{1,3}(?=(\d{3})+$)/g; var n1=num.toString().replace(/^ ...
- Less用法注意事项
(1)引入顺序 引入你的 .less 样式文件的时候要设置 rel 属性值为 “stylesheet/less”: <link rel="stylesheet/less" t ...
- <Redis> 入门六 主从复制方式的集群
1.集群如何操作 现在有三台虚拟机,ip分别为100,105,106,将100作为master,其他两台作为slave 1.vim redis.conf 以前的版本是 slaveof <mast ...
- Excel OLE控制
来源:http://blog.csdn.net/chelen_jak/article/details/7069095 Delphi 控制Excel(一) 使用动态创建的方法 首先创建 Excel 对 ...
- python多线程和多进程(二)
---恢复内容开始--- 一.多进程 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. impor ...