P2053 [SCOI2007]修车

题目描述

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

说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。

输入输出格式

输入格式:

第一行有两个数M,N,表示技术人员数与顾客数。

接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时间T。

输出格式:

最小平均等待时间,答案精确到小数点后2位。

说明

\(2<=M<=9,1<=N<=60,1<=T<=1000\)


感觉费用流建模好难啊,也许是接触的少了?

我们发现每个车要把前面修车的都等一遍,也就是说如果某个技术人员连续修理\(c_1,c_2,..,c_n\)这些车,等待的总时间其实是\(w_1*n+w_2*(n-1)+...+w_n*1\)

我们可以把这些项分开处理。把每个修车的拆成车那么多个点,表示这个修车的在第几位给这个车子修车。

可以把车和新的修车的点看成两个集合,即是二分图带权匹配。

连边

1.S连每个车,容1费0

2.每个车连修车的点集,容1费层数*原始修车费用

3.修车的点连T,容1费0

还有一点,这样为什么保证了对于某个修车的\(j\)跑了第\(i\)层的点时前\(i-1\)层的点都跑过了呢?因为边权是正的跑最小费用最大流的时候贪心就一定先把费用比较小的跑掉了


Code:

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. const int N=802;
  5. const int M=80010;
  6. const int inf=0x3f3f3f3f;
  7. int head[N],to[M],Next[M],edge[M],cost[M],cnt=1;
  8. void add(int u,int v,int w,int c)
  9. {
  10. to[++cnt]=v;edge[cnt]=w;cost[cnt]=c;Next[cnt]=head[u];head[u]=cnt;
  11. to[++cnt]=u;edge[cnt]=0;cost[cnt]=-c;Next[cnt]=head[v];head[v]=cnt;
  12. }
  13. int t,n,m;
  14. void init()
  15. {
  16. scanf("%d%d",&m,&n);//技术人员,车子数量
  17. for(int i=1;i<=n;i++)
  18. {
  19. for(int j=1;j<=m;j++)
  20. {
  21. scanf("%d",&t);
  22. for(int k=1;k<=n;k++)
  23. add(i,n+(k-1)*m+j,1,t*k);
  24. }
  25. add(0,i,1,0);
  26. }
  27. t=n+n*m+1;
  28. for(int j=1;j<=m;j++)
  29. for(int k=1;k<=n;k++)
  30. add(n+(k-1)*m+j,t,1,0);
  31. }
  32. int dep[N],dis[N],used[N],pre[N],ans;
  33. bool spfa()
  34. {
  35. memset(dis,0x3f,sizeof(dis));
  36. dis[0]=0;
  37. std::queue <int > q;
  38. q.push(0);
  39. while(!q.empty())
  40. {
  41. int u=q.front();
  42. q.pop();
  43. used[u]=0;
  44. for(int i=head[u];i;i=Next[i])
  45. {
  46. int v=to[i];
  47. if(!dep[v]&&edge[i]&&dis[v]>dis[u]+cost[i])
  48. {
  49. dis[v]=dis[u]+cost[i];
  50. pre[v]=i;
  51. if(!used[v]) {used[v]=1;q.push(v);}
  52. }
  53. }
  54. }
  55. return dis[t]!=inf;
  56. }
  57. void costflow()
  58. {
  59. while(spfa())
  60. {
  61. int mi=inf;
  62. ans+=dis[t];
  63. for(int now=t;now;now=to[pre[now]^1])
  64. mi=mi>edge[pre[now]]?edge[pre[now]]:mi;
  65. for(int now=t;now;now=to[pre[now]^1])
  66. edge[pre[now]]-=mi,edge[pre[now]^1]+=mi;
  67. }
  68. }
  69. int main()
  70. {
  71. init();
  72. costflow();
  73. printf("%.2lf",double(ans)/double(n));
  74. return 0;
  75. }

2018.7.14

洛谷 P2053 [SCOI2007]修车 解题报告的更多相关文章

  1. 洛谷$P2053\ [SCOI2007]$修车 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 一个很妙的建图,,,说实话我麻油想到$QwQ$ 考虑对每个工人建$n$个点,表示这是他修的倒数第$i$辆车,就可以算出影响是$t\cdot i$,然后对每辆 ...

  2. [bzoj1070] [洛谷P2053] [SCOI2007] 修车

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

  3. 洛谷 P2053 [SCOI2007]修车(最小费用最大流)

    题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...

  4. 洛谷 P2053 [SCOI2007]修车

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

  5. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  6. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  7. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  8. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  9. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

随机推荐

  1. Django的简介

    一.MTV模型 Django的MTV模式: Model(模型):和数据库相关的.负责业务对象与数据库的对象(ORM) Template(,模板):放所有的HTML文件 模板语法:目的是将变量(数据库内 ...

  2. stl源码分析之priority queue

    前面两篇介绍了gcc4.8的vector和list的源码实现,这是stl最常用了两种序列式容器.除了容器之外,stl还提供了一种借助容器实现特殊操作的组件,谓之适配器,比如stack,queue,pr ...

  3. IIC通讯程序

    IIC程序 IIC起始信号 void IIC_Start(void) { SDA_OUT();//sda设为输出 IIC_SDA=; IIC_SCL=; delay_us();//延时一段时间,具体时 ...

  4. PHP:Iterator(迭代器)接口和生成器

    迭代器 可在内部迭代自己的外部迭代器或类的接口.详情:http://php.net/manual/zh/class.iterator.php 接口摘要 Iterator extends Travers ...

  5. MantisBT导出Excel文件名显示中文的修改方法

    我安装的是 mantisbt-2.15.0. 在“查看问题”页面导出Excel文件后,其文件名虽然是我选择的项目名称,但是,若项目名称中有中文,这就是用%加编码显示. 解决方法是: 在  <Ma ...

  6. 基于日志报警插件 elastalert 实现告警

    1.官方http://elastalert.readthedocs.io/en/latest/ 2.报警规则示例 http://elastalert.readthedocs.io/en/latest/ ...

  7. Ubuntu系统下在PyCharm里用virtualenv集成TensorFlow

    我的系统环境 Ubuntu 18.04 Python3.6 PyCharm 2018.3.2 community(免费版) Java 1.8 安装前准备 由于众所周知的原因,安装中需要下载大量包,尽量 ...

  8. 亮眼的购物季数据,高涨的 Amazon Prime

    依照往年的惯例,亚马逊公布了 2013 购物季的销售数据.据 The Verge 的报道,今年,仅仅网购星期一(Cyber Monday)一天就在全球范围内销售出 3680 万件商品,而去年这一数字为 ...

  9. C#控制台应用程序

    使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)编辑C#源代码: (3)编译运行: 例题:在控制台输出“Hello world!”. 第一步:文件→新建→项目:选择“项目类型”为Vis ...

  10. nodejs 中on 和 emit

    首先测试用例: var EventEmitter = require('events').EventEmitter var life = new EventEmitter(); // life.on( ...