正题

给出m个师傅,n台车,并给出每个师傅各个车的时间,现在要使得,n辆车一起来,等待时间最短。

我们来观察一个师傅所消耗的等待时间。m个师傅所消耗的总等待时间就是车主的总等待时间。

对于第a个师傅,修的车的序列是,那么总等待时间就是,因为第i个车要被自己和后面的车等待,所以会被算tot-i+1次。

那么建图就是分显而易见了,对于m个师傅,每个师傅拆n个点,第a个师傅的第i个点表示的是第a个师傅修倒数第i辆车。那么n个点表示车。

倒数第1辆车只会被自己等待,所以从这点连向每一辆车j,表示可以修这一辆车,流量为1,费用为

倒数第2辆车会被等待两次,所以从这个点连向每一辆车j,流量为1,费用为

......

那么最后我们从源点流量为1,费用为0的边向所有时间段的师傅。从每一辆车连流量为1,费用为0的边向汇点。

最小费用最大流跑一下。

Done.

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;struct edge{int x,y,next,c,cos;
}s[100010];
int n,m;
int len=1;
int begin,end;
int d[1210],mmin[1210],last[1210],first[1210];
bool tf[1210];
queue<int> f;void ins(int x,int y,int c,int cos){len++;s[len]=(edge){x,y,first[x],c,cos};first[x]=len;len++;s[len]=(edge){y,x,first[y],0,-cos};first[y]=len;
}bool SPFA(int &cost,int&flow){memset(d,63,sizeof(d));memset(tf,false,sizeof(tf));memset(mmin,63,sizeof(mmin));memset(last,0,sizeof(last));f.push(begin);d[begin]=0;tf[begin]=true;while(!f.empty()){int x=f.front();f.pop();tf[x]=false;for(int i=first[x];i!=0;i=s[i].next){int y=s[i].y;if(d[y]>d[x]+s[i].cos && s[i].c>0){mmin[y]=min(mmin[x],s[i].c);d[y]=d[x]+s[i].cos;last[y]=i;if(!tf[y]){tf[y]=true;f.push(y);}}}}if(d[end]==d[end+1]) return false;cost+=d[end]*mmin[end];flow+=mmin[end];int now=end;while(now!=begin){s[last[now]].c-=mmin[end];s[last[now]^1].c+=mmin[end];now=s[last[now]].x;}return true;
}void MCMF(){int cost=0,flow=0;while(SPFA(cost,flow));printf("%.2lf\n",(double)cost/n);
}int main(){scanf("%d %d",&m,&n);begin=0,end=n*m+n+1;int type=n*m;int c;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&c);for(int k=1;k<=n;k++) ins((j-1)*n+k,type+i,1,k*c);}}for(int i=1;i<=type;i++) ins(begin,i,1,0);for(int i=type+1;i<end;i++) ins(i,end,1,0);MCMF();
}

[SCOI2007]修车,洛谷P2053,最小费用最大流相关推荐

  1. 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa

    题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...

  2. 洛谷 - P4043 [AHOI2014/JSOI2014]支线剧情(最小费用可行流)

    题目链接:点击查看 题目大意:给出一张 n 个点的有向图,每条边都有边权,现在要求将每条边至少遍历一遍,问最小的边权为多少 题目分析:建图时将每条边都设置流量为 [ 1 , inf ] ,就变成最小费 ...

  3. 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...

  4. 洛谷 - P4009 汽车加油行驶问题(分层图最短路/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵表示道路,途中有一些加油站,现在要从点(1,1)到达点(n,n),问最小花费,其中的一些规则如下: 汽车只能沿着网格边行驶,装满油后可以行驶K条边,出 ...

  5. 洛谷 - P4016 负载平衡问题(最小费用最大流)

    题目链接:点击查看 题目大意:有n个仓库分布在一个环形的区域,现在每个仓库可以与相邻的两个仓库转移货物,问最少需要操作多少次才能让每个仓库的货物都达到平衡 题目分析:达到平衡的意思其实就是都等于平均值 ...

  6. 洛谷 P4016 负载平衡问题 【最小费用最大流】

    求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相 ...

  7. bzoj 1070: [SCOI2007]修车【最小费用最大流】

    一开始从客人角度想的,怎么建都不对 从一个修车工所接待的所有顾客花费的总时间来看,设一共有x个人,那么第一个修的对总时间的贡献是x*w1,第二个是(x-1)*w2-以此类推.所以把第i个修车工拆成n组 ...

  8. 信息学奥赛一本通 1344:【例4-4】最小花费 | 洛谷 P1576 最小花费

    [题目链接] ybt 1344:[例4-4]最小花费 洛谷 P1576 最小花费 [题目考点] 1. 图论 单源最短路径 时间复杂度: Dijkstra算法: O(V2)O(V^2)O(V2) Dij ...

  9. 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划

    洛谷4951 地震 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define ...

最新文章

  1. Spring 之常用接口
  2. 6月8号=》105页-110页
  3. 找工作是一种必须的生活阅历
  4. 趣链 BitXHub跨链平台 (8)交易验证
  5. Flutter Dart:用数字分组显示大数字
  6. Kafka的优化建议
  7. 2015中国大数据技术大会在北京隆重开幕
  8. (53)Xilinx时钟原语-BUG与IBUFG(第11天)
  9. delphi 检测网络是否连通_WebRTC:连接建立过程的网络穿透
  10. PAT L1-019. 谁先倒
  11. 线性规划图解法求最优解_线性规划的图解法6.ppt
  12. JavaScript——DOM文档
  13. 【雅思大作文考官范文】——第十九篇:独居人口' essay
  14. 2022-2028全球与中国智能家居产品市场现状及未来发展趋势
  15. linux yum下载不安装,CentOS 7设置yum仅仅下载rpm不安装总结
  16. Ubuntu 18.04配置静态IP地址
  17. ckc交易什么意思_股前加r是什么意思?股市kdj线图如何看?
  18. linux系统玩ps3模拟器下载地址,【RPCS3模拟器】RPCS3模拟器下载(PS3模拟器) 电脑版-开心电玩...
  19. 2017年华为实习面试心得
  20. 信号的周期、频率和角频率关系

热门文章

  1. 未能加载文件或程序集“xxx”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集
  2. php stderr,Exec()之后的PHP StdErr
  3. http状态码批量检测工具
  4. android怎么判断当前网络是否可用,Android 判断当前网络是否可用简单实例
  5. 堆栈区别java总结_堆栈的区别
  6. Flash处理外部XML文档数据详细教程
  7. Flash处理XML文档数据教程
  8. python+PyQt5 Excel小工具开发
  9. jsp include中文乱码问题解决方案
  10. 请官方速推适合想脱离摆烂人群的学习方法