题意:同一时刻有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

  1. var head,vet,next,len1,len2,dis,fan:array[..]of longint;
  2. inq:array[..]of boolean;
  3. pre:array[..,..]of longint;
  4. q:array[..]of longint;
  5. a,num:array[..,..]of longint;
  6. n,m,i,j,k,tot,src,source,s:longint;
  7. ans:double;
  8.  
  9. function min(x,y:longint):longint;
  10. begin
  11. if x<y then exit(x);
  12. exit(y);
  13. end;
  14.  
  15. procedure add(a,b,c,d:longint);
  16. begin
  17. //writeln(a,' ',b,' ',c,' ',d);
  18. inc(tot);
  19. next[tot]:=head[a];
  20. vet[tot]:=b;
  21. len1[tot]:=c;
  22. len2[tot]:=d;
  23. head[a]:=tot;
  24.  
  25. inc(tot);
  26. next[tot]:=head[b];
  27. vet[tot]:=a;
  28. len1[tot]:=;
  29. len2[tot]:=-d;
  30. head[b]:=tot;
  31. end;
  32.  
  33. function spfa:boolean;
  34. var u,e,v,i,t,w:longint;
  35. begin
  36. for i:= to s do
  37. begin
  38. dis[i]:=maxlongint>>;
  39. inq[i]:=false;
  40. end;
  41. t:=; w:=; q[]:=source; dis[source]:=; inq[source]:=true;
  42. while t<w do
  43. begin
  44. inc(t); u:=q[t mod ];
  45. inq[u]:=false;
  46. e:=head[u];
  47. while e<> do
  48. begin
  49. v:=vet[e];
  50. if (len1[e]>)and(dis[u]+len2[e]<dis[v]) then
  51. begin
  52. pre[v,]:=u;
  53. pre[v,]:=e;
  54. dis[v]:=dis[u]+len2[e];
  55. if not inq[v] then
  56. begin
  57. inc(w); q[w mod ]:=v; inq[v]:=true;
  58. end;
  59. end;
  60. e:=next[e];
  61. end;
  62. end;
  63. if dis[src]=maxlongint>> then exit(false);
  64. exit(true);
  65. end;
  66.  
  67. procedure mcf;
  68. var k,e,t:longint;
  69. begin
  70. k:=src; t:=maxlongint;
  71. while k<>source do
  72. begin
  73. t:=min(t,len1[pre[k,]]);
  74. k:=pre[k,];
  75. end;
  76. k:=src;
  77. while k<>source do
  78. begin
  79. e:=pre[k,];
  80. len1[e]:=len1[e]-t;
  81. len1[fan[e]]:=len1[fan[e]]+t;
  82. ans:=ans+t*len2[e];
  83. k:=pre[k,];
  84. end;
  85. end;
  86.  
  87. begin
  88. assign(input,'bzoj1070.in'); reset(input);
  89. assign(output,'bzoj1070.out'); rewrite(output);
  90. readln(m,n);
  91. for i:= to do
  92. if i and = then fan[i]:=i+
  93. else fan[i]:=i-;
  94. for i:= to n do
  95. for j:= to m do read(a[i,j]);
  96. s:=n;
  97. for i:= to m do
  98. for j:= to n do
  99. begin
  100. inc(s); num[i,j]:=s;
  101. end;
  102. inc(s); source:=s;
  103. inc(s); src:=s;
  104. for i:= to n do add(source,i,,);
  105. for i:= to n do
  106. for j:= to m do
  107. for k:= to n do add(i,num[j,k],,a[i,j]*k);
  108. for i:= to m do
  109. for j:= to n do add(num[i,j],src,,);
  110. while spfa do mcf;
  111. writeln(ans/n::);
  112. close(input);
  113. close(output);
  114. end.

【BZOJ1070】修车(费用流)的更多相关文章

  1. [SCOI2007][bzoj1070] 修车 [费用流]

    题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...

  2. LG2053/BZOJ1070 「SCOI2007」修车 费用流

    问题描述 LG2053 BZOJ1070 题解 将\(m\)个修理工拆为\(n \times m\)个,将修理工和车辆看做二分图,连出一个完全二分图. 边流量为\(1\),费用为时间,费用流即可. \ ...

  3. [bzoj1070][SCOI2007]修车——费用流

    题目大意: 传送门 题解: 本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,<挑战程序设计竞赛>一 ...

  4. [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

  5. bzoj 1070: [SCOI2007]修车 费用流

    1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2785  Solved: 1110[Submit][Status] ...

  6. P2053 [SCOI2007]修车 费用流

    $ \color{#0066ff}{ 题目描述 }$ 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M ...

  7. bzoj 1070 修车 —— 费用流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1070 需要考虑前面修的车对后面等待的车造成的时间增加: 其实可以从每个人修车的顺序考虑,如果 ...

  8. BZOJ 1070 修车(费用流)

    如果能想到费用流,这道题就是显然了. 要求所有人的等待平均时间最小,也就是所有人的总等待时间最小. 每辆车只需要修一次,所以s连每辆车容量为1,费用为0的边. 现在需要把每个人拆成n个点,把车和每个人 ...

  9. 【BZOJ 1070】[SCOI2007]修车 费用流

    就是拆个点限制一下(两点一排一大片),这道题让我注意到了限制这个重要的词.我们跑网络流跑出来的图都是有一定意义的,一般这个意义就对应了问题的一种方案,一般情况下跑一个不知道对不对的方案是相对容易的我们 ...

  10. 【BZOJ1070】[SCOI2007]修车 费用流

    [BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...

随机推荐

  1. 转】RDD与DataFrame的转换

    原博文出自于: http://www.cnblogs.com/namhwik/p/5967910.html RDD与DataFrame转换1. 通过反射的方式来推断RDD元素中的元数据.因为RDD本身 ...

  2. npm安装淘宝镜像cnpm报错npm ERR! errno -4048

    今天在安装淘宝镜像的时候报错了,第一次遇上,表示很懵逼 然后捣腾了半天以为是npm install 的时候出错,后来网上查到是 装淘宝镜像cnpm的时候报错,好像是权限问题,解决方法:  npm ca ...

  3. SQL将查询出来的多列的值拼接成一个字符串

    -- 单列拼接,先查出一行,再加上逗号,接着拼接 查出的下一行 SELECT GROUP_CONCAT(user_id) FROM user; -- result 160,160,160,196 -- ...

  4. SQL Server性能调优——报表数据库与业务数据库分离

    前段时间把公司的主数据库切了,分成业务库和报表库,业务库向报表库进行实时的Replication.这个项目的上线提升了系统的性能和可维护性,现在把设计时的考量和所做的工作重新回顾一下,作为备忘. 项目 ...

  5. vue获取dom元素高度的方法

    获取高度: <div ref="自定义名称" > </div>要在钩子mounted里面dom结构生成后去获取dom的高度,宽度,修改样式等操作!!! mo ...

  6. js添加千位分隔符

    function thousandBitSeparator(num){ var re=/\d{1,3}(?=(\d{3})+$)/g; var n1=num.toString().replace(/^ ...

  7. Less用法注意事项

    (1)引入顺序 引入你的 .less 样式文件的时候要设置 rel 属性值为 “stylesheet/less”: <link rel="stylesheet/less" t ...

  8. <Redis> 入门六 主从复制方式的集群

    1.集群如何操作 现在有三台虚拟机,ip分别为100,105,106,将100作为master,其他两台作为slave 1.vim redis.conf 以前的版本是 slaveof <mast ...

  9. Excel OLE控制

    来源:http://blog.csdn.net/chelen_jak/article/details/7069095 Delphi  控制Excel(一) 使用动态创建的方法 首先创建 Excel 对 ...

  10. python多线程和多进程(二)

    ---恢复内容开始--- 一.多进程 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. impor ...