题目链接

  早上状态不好,虚树搞崩只好来刷网络流了qwq。

  (然后我犹豫几秒之后看了题解)

  使用拆点大法把工人拆成n*m个点,然后每个点代表每个时间段的工人,

  然后从车到每个工人点连一条边,权值是耽误的时间,就是这个车在这个时间段用这个工人所用的时间。

  然后跑费用流。

  (然后我太菜了费用流忘了怎么打了,回头一翻自己博客发现居然只是一周之前学的东西)

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cctype>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<queue>
  7. #define maxn 30000
  8. using namespace std;
  9.  
  10. inline long long read(){
  11. long long num=,f=;
  12. char ch=getchar();
  13. while(!isdigit(ch)){
  14. if(ch=='-') f=-;
  15. ch=getchar();
  16. }
  17. while(isdigit(ch)){
  18. num=num*+ch-'';
  19. ch=getchar();
  20. }
  21. return num*f;
  22. }
  23.  
  24. inline int count(int i){ return i&?i+:i-; }
  25.  
  26. int dfn[maxn];
  27. bool vis[maxn];
  28. int Start,End;
  29.  
  30. struct Edge{
  31. int from,next,to,dis,val,flow;
  32. }edge[maxn*];
  33. int head[maxn],num;
  34. inline void addedge(int from,int to,int dis,int val){
  35. edge[++num]=(Edge){from,head[from],to,dis,val,};
  36. head[from]=num;
  37. }
  38. inline void add(int from,int to,int dis,int val){
  39. addedge(from,to,dis,val);
  40. addedge(to,from,-dis,);
  41. }
  42.  
  43. struct Ans{
  44. int dis,val;
  45. Ans(){dis=val=;}
  46. };
  47.  
  48. int dis[maxn];
  49. int pre[maxn];
  50. int flow[maxn];
  51.  
  52. Ans spfa(){
  53. Ans ans;
  54. memset(dis,/,sizeof(dis)); int Max=dis[];
  55. dis[Start]=; flow[Start]=0x7fffffff;
  56. queue<int>q; q.push(Start);
  57. while(!q.empty()){
  58. int from=q.front();q.pop();vis[from]=;
  59. for(int i=head[from];i;i=edge[i].next){
  60. int to=edge[i].to;
  61. if(edge[i].dis+dis[from]>=dis[to]||edge[i].val==edge[i].flow) continue;
  62. dis[to]=dis[from]+edge[i].dis;
  63. pre[to]=i;
  64. flow[to]=min(flow[from],edge[i].val-edge[i].flow);
  65. if(!vis[to]){
  66. vis[to]=;
  67. q.push(to);
  68. }
  69. }
  70. }
  71. if(dis[End]==Max) return ans;
  72. int now=End; ans.val=flow[End]; ans.dis=dis[End];
  73. while(now!=Start){
  74. int ret=pre[now];
  75. edge[ret].flow+=flow[End];
  76. edge[count(ret)].flow-=flow[End];
  77. now=edge[ret].from;
  78. }
  79. return ans;
  80. }
  81.  
  82. double ans;
  83.  
  84. int main(){
  85. int m=read(),n=read();End=maxn-;
  86. for(int i=;i<=n;++i)
  87. add(Start,i,,);
  88. for(int j=;j<=m;++j)
  89. for(int i=;i<=n;++i) add((i-)*m+n+j,End,,);
  90. for(int i=;i<=n;++i)
  91. for(int j=;j<=m;++j){
  92. int x=read();
  93. for(int k=;k<=n;++k)
  94. add(i,(k-)*m+j+n,k*x,);
  95. }
  96. while(){
  97. Ans now=spfa();
  98. if(!now.val) break;
  99. ans+=now.dis*now.val;
  100. }
  101. printf("%.2lf",ans/n);
  102. return ;
  103. }

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

  1. luogu P3305 [SDOI2013]费用流

    题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...

  2. P2053 [SCOI2007]修车 费用流

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

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

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

  4. bzoj 1070 修车 —— 费用流

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

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

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

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

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

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

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

  8. BZOJ 1070 修车(费用流)

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

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

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

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

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

随机推荐

  1. AJAX不能访问MVC后台程序的问题

    AJAX不能访问后台的MVC有可能是MVC的后台程序加入了身份验证[Authorize]标记,这样前台的AJAX虽然结果显示的是4和200但是responsetext的值可以看到是返回了一个配置文件中 ...

  2. Android(java)学习笔记117:SharedPreferences(轻量级存储类)

    1.SharedPreferences是Android平台上一个轻量级的存储类,简单的说就是可以存储一些我们需要的变量信息.2个activity 之间的数据传递除了可以他通过intent来传递数据,还 ...

  3. 2018.2.11 JS的定时器制作

    定时器 1.定时器定义 var time = window.setInterval("执行名词",间隔时间) 关闭定时器 clearInterval(定时器名称) 倒计时定时器 s ...

  4. java abstraction and encapsulation

    How is Abstraction different from Encapsulation? Abstraction happens at class level design. It resul ...

  5. jQuery向界面输出时保留两位小数

    通过JSTL下的<fmt:formatNumber>标签实现,具体实现代码如下: <%@ taglib uri="http://java.sun.com/jsp/jstl/ ...

  6. 01_3_创建一个Action

    01_3_创建一个Action 1. 定义一个action 具体视图的返回可以由用户自己定义的Action来决定 具体的手段是根据返回的字符串找到相应的配置项,来决定视图的内容 具体Action的实现 ...

  7. 转 Spring Security 简介

    https://blog.csdn.net/xlecho/article/details/80026527 Spring Security 简介 2018年04月21日 09:53:02 阅读数:13 ...

  8. destoon模块自定义字段的添加并让其支持搜索的方法

    今天看了看模块设置里的自定义字段功能的用法,试着加了个新字段glry,设置了值,然后去数据库moduleid的article表看,字段成功加上了. 于是去template下article文件夹的lis ...

  9. paper:基于verilog HDL 的高速可综合FSM设计

    1.寄存器输出型状态机 VS 组合逻辑输出型状态机 2.状态编码方法 这块讲的不好,也比较少. 3.系统设计中模块划分的指导性原则

  10. Laravel中chunk组块结果集处理

    如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令.chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理.使用 chunk 方法能够在处 ...