修车修到jiry报废(滑稽)

题意:m个人修n个车,同时开始。

每辆车只能给一个人修。每个人修每辆车的用时都不同。

问怎样安排能使每辆车的等待时间总和最少。

解:

一直想的是用以流量表示一个人,没想到是一流量表示一辆车......

答案统计也想错了...应该是统计每辆车修的时候对它以及它后面车的贡献。

比如当前这辆车的后面还有k辆,那么时间就要乘k + 1

每辆车可以给每个人修,后面可以安排任意辆车。据此拆点,把每个人拆成n个。

源点向车连边,车向每个人的后面有几辆车(一共m * n个点)连边,然后连到汇点。

跑最小费用最大流即可。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <queue>
  4. #include <cstring>
  5.  
  6. const int N = , M = , INF = 0x3f3f3f3f;
  7.  
  8. struct Edge {
  9. int nex, v, c, len;
  10. }edge[M << ]; int top = ;
  11.  
  12. int e[N], d[N], vis[N], pre[N], flow[N];
  13. std::queue<int> Q;
  14. int G[][];
  15.  
  16. inline void add(int x, int y, int z, int w) {
  17. top++;
  18. edge[top].v = y;
  19. edge[top].c = z;
  20. edge[top].len = w;
  21. edge[top].nex = e[x];
  22. e[x] = top;
  23.  
  24. top++;
  25. edge[top].v = x;
  26. edge[top].c = ;
  27. edge[top].len = -w;
  28. edge[top].nex = e[y];
  29. e[y] = top;
  30. return;
  31. }
  32.  
  33. inline bool SPFA(int s, int t) {
  34. memset(d, 0x3f, sizeof(d));
  35. d[s] = ;
  36. flow[s] = INF;
  37. vis[s] = ;
  38. Q.push(s);
  39. while(!Q.empty()) {
  40. int x = Q.front();
  41. Q.pop();
  42. vis[x] = ;
  43. for(int i = e[x]; i; i = edge[i].nex) {
  44. int y = edge[i].v;
  45. if(edge[i].c && d[y] > d[x] + edge[i].len) {
  46. d[y] = d[x] + edge[i].len;
  47. pre[y] = i;
  48. flow[y] = std::min(flow[x], edge[i].c);
  49. if(!vis[y]) {
  50. vis[y] = ;
  51. Q.push(y);
  52. }
  53. }
  54. }
  55. }
  56. return d[t] < INF;
  57. }
  58.  
  59. inline void update(int s, int t) {
  60. int temp = flow[t];
  61. while(t != s) {
  62. int i = pre[t];
  63. edge[i].c -= temp;
  64. edge[i ^ ].c += temp;
  65. t = edge[i ^ ].v;
  66. }
  67. return;
  68. }
  69.  
  70. inline int solve(int s, int t, int &cost) {
  71. int ans = ;
  72. cost = ;
  73. while(SPFA(s, t)) {
  74. ans += flow[t];
  75. cost += flow[t] * d[t];
  76. update(s, t);
  77. }
  78. return ans;
  79. }
  80.  
  81. int m;
  82. inline int id(int x, int y) {
  83. return (x - ) * m + y;
  84. }
  85.  
  86. int main() {
  87.  
  88. int n;
  89. scanf("%d%d", &m, &n);
  90. for(int i = ; i <= n; i++) {
  91. for(int j = ; j <= m; j++) {
  92. scanf("%d", &G[i][j]);
  93. }
  94. }
  95. int s = (m + ) * n + ;
  96. int t = s + ;
  97. for(int a = ; a <= n; a++) {
  98. add(s, a, , );
  99. for(int j = ; j <= m; j++) {
  100. for(int i = ; i <= n; i++) {
  101. add(a, n + id(i, j), , i * G[a][j]);
  102. }
  103. }
  104. for(int j = ; j <= m; j++) {
  105. add(n + id(a, j), t, , );
  106. }
  107. }
  108. int ans;
  109. solve(s, t, ans);
  110. printf("%.2f", 1.0 * ans / n);
  111. return ;
  112. }

AC代码

洛谷P2053 修车的更多相关文章

  1. 洛谷 P2053 [SCOI2007]修车 解题报告

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

  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. 洛谷$P2053\ [SCOI2007]$修车 网络流

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

  6. 【洛谷2053】 [SCOI2007]修车(费用流)

    传送门 洛谷 Solution 考虑把每一个修车工人拆成\(n\)个点,那么考虑令\(id(i,j)\)为第\(i\)个工人倒数第\(j\)次修车. 然后就可以直接跑费用流了!!! 代码实现 /* m ...

  7. 【洛谷2050】 [NOI2012]美食节(费用流)

    大家可以先看这道题目再做! SCOI2007修车 传送门 洛谷 Solution 就和上面那道题目一样的套路,但是发现你会获得60~80分的好成绩!!! 考虑优化,因为是SPFA,所以每一次只会走最短 ...

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

随机推荐

  1. tf tensor 输出

    在学习TensorFlow的过程中,我们需要知道某个tensor的值是什么,这个很重要,尤其是在debug的时候.也许你会说,这个很容易啊,直接print就可以了.其实不然,print只能打印输出sh ...

  2. MIT一牛人对数学在机器学习中的作用给的评述

    MIT一牛人对数学在机器学习中的作用给的评述 转载自http://my.oschina.net/feedao/blog/52252,不过这个链接也是转载的,出处已经无从考证了.   感觉数学似乎总是不 ...

  3. Centos7下python3安装ipython

    一.通过压缩包安装ipython 1.下载ipython安装包 [root@localhost ~]# wget https://pypi.python.org/packages/79/63/b671 ...

  4. springboot 设置 session 过期时间

    application.properties server.session.timeout=86400 #单位(s) 这里是24小时

  5. idea java方法中 传多个参数对象 的复制粘贴快速处理方法

    比如像这种的传多个参数对象,我是直接复制过来,然后把第一个字母改成大写,然后后面的实例对象敲一个第一个字符的小写,回车就直接出来了 在写调用参数的地方,ctrl+p 调出提示,然后按下提示里的实例的第 ...

  6. R绘图 第九篇:绘制散点图和气泡图(ggplot2)

    绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ...

  7. PowerBI开发 第五篇:关系和交互

    PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...

  8. CTE 递归查询全解

    TSQL脚本能实现递归查询,用户使用共用表表达式 CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询.本文详细介绍CTE递归调用的特性和使用示例,递归查询 ...

  9. Redis发布订阅和事物笔记

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  10. Mvc4_mvc4跟mysql语法

    mvc4: 子页面:@section A{} 母页面:@RenderSection("A",false) false:别的页面没有定义为A的Section的话 也没事,layout ...