[SCOI2007]修车

https://www.lydsy.com/JudgeOnline/problem.php?id=1070

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 7306  Solved: 3108
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

2 2
3 2
1 4

Sample Output

1.50

HINT

数据范围: (2<=M<=9,1<=N<=60), (1<=T<=1000)

将一个工人拆成n个点,第k个点表示这个工人倒数第k个修车i,那么每辆车向工人连一条容量为1,费用为k*c,

表示修自己的车的一个费用,和后面k-1个人等待的费用,就是算自己费用的同时算上别人的费用。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<cstring>
  5. #include<cstdio>
  6. using namespace std;
  7.  
  8. const int INF=0x3f3f3f3f;
  9. const int N=;
  10. const int M=;
  11. int top;
  12. int dist[N],pre[N];
  13. bool vis[N];
  14. int c[N];
  15. int maxflow;
  16.  
  17. struct Vertex{
  18. int first;
  19. }V[N];
  20. struct Edge{
  21. int v,next;
  22. int cap,flow,cost;
  23. }E[M];
  24.  
  25. void init(){
  26. memset(V,-,sizeof(V));
  27. top=;
  28. maxflow=;
  29. }
  30.  
  31. void add_edge(int u,int v,int c,int cost){
  32. E[top].v=v;
  33. E[top].cap=c;
  34. E[top].flow=;
  35. E[top].cost=cost;
  36. E[top].next=V[u].first;
  37. V[u].first=top++;
  38. }
  39.  
  40. void add(int u,int v,int c,int cost){
  41. add_edge(u,v,c,cost);
  42. add_edge(v,u,,-cost);
  43. }
  44.  
  45. bool SPFA(int s,int t,int n){
  46. int i,u,v;
  47. queue<int>qu;
  48. memset(vis,false,sizeof(vis));
  49. memset(c,,sizeof(c));
  50. memset(pre,-,sizeof(pre));
  51. for(i=;i<=n;i++){
  52. dist[i]=INF;
  53. }
  54. vis[s]=true;
  55. c[s]++;
  56. dist[s]=;
  57. qu.push(s);
  58. while(!qu.empty()){
  59. u=qu.front();
  60. qu.pop();
  61. vis[u]=false;
  62. for(i=V[u].first;~i;i=E[i].next){
  63. v=E[i].v;
  64. if(E[i].cap>E[i].flow&&dist[v]>dist[u]+E[i].cost){
  65. dist[v]=dist[u]+E[i].cost;
  66. pre[v]=i;
  67. if(!vis[v]){
  68. c[v]++;
  69. qu.push(v);
  70. vis[v]=true;
  71. if(c[v]>n){
  72. return false;
  73. }
  74. }
  75. }
  76. }
  77. }
  78. if(dist[t]==INF){
  79. return false;
  80. }
  81. return true;
  82. }
  83.  
  84. int MCMF(int s,int t,int n){
  85. int d;
  86. int i,mincost;
  87. mincost=;
  88. while(SPFA(s,t,n)){
  89. d=INF;
  90. for(i=pre[t];~i;i=pre[E[i^].v]){
  91. d=min(d,E[i].cap-E[i].flow);
  92. }
  93. maxflow+=d;
  94. for(i=pre[t];~i;i=pre[E[i^].v]){
  95. E[i].flow+=d;
  96. E[i^].flow-=d;
  97. }
  98. mincost+=dist[t]*d;
  99. // cout<<dist[t]<<" "<<d<<endl;
  100. }
  101. return mincost;
  102. }
  103.  
  104. int main(){
  105. int n,m;
  106. int v,u,w,c;
  107. int s,t;
  108. scanf("%d %d",&m,&n);
  109. s=,t=m*n+n+;
  110. init();
  111. //s->people->car->t
  112. for(int i=;i<=n;i++){//车
  113. for(int j=;j<=m;j++){//人
  114. scanf("%d",&c);
  115. for(int k=;k<=n;k++){
  116. add((j-)*n+k,m*n+i,,c*k);
  117. }
  118. }
  119. }
  120. for(int i=;i<=m;i++){
  121. for(int j=;j<=n;j++){
  122. add(s,n*(i-)+j,,);
  123. }
  124. }
  125. for(int i=;i<=n;i++){
  126. add(m*n+i,t,,);
  127. }
  128. double ans=MCMF(s,t,n+m*n+);
  129. printf("%.2f\n",ans/n);
  130. }
  131. /*
  132. 2 2
  133. 3 2
  134. 1 4
  135.  
  136. 2 3
  137. 1 2 3
  138. 4 5 6
  139. */

[SCOI2007]修车(建图好题)的更多相关文章

  1. poj 3281 Dining 网络流-最大流-建图的题

    题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...

  2. joj 2453 candy 网络流建图的题

    Problem D: Candy As a teacher of a kindergarten, you have many things to do during a day, one of whi ...

  3. POJ 2195 一人一房 最小费用流 建图 水题

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21010   Accepted: 10614 Desc ...

  4. CF786B Legacy 线段树优化建图 + spfa

    CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给 ...

  5. 7月13日考试 题解(DFS序+期望+线段树优化建图)

    T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...

  6. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  7. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  8. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. Battle ships(二分图,建图,好题)

    Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

随机推荐

  1. python 可视化 二维坐标标注等等

     基本画图操作: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2*x+1 y2 = ...

  2. CentOS 6.4 添加永久静态路由所有方法汇总(原创)

    转摘,原文章地址:http://blog.sina.com.cn/s/blog_828e50020101ern5.html 查看路由的命令route -n CentOS添加永久静态路由 在使用双网卡, ...

  3. mongodb 怎样检测 安装成功 以及mongodb的一些增删改查命令

    mongodb 主页 http://www.mongodb.org/ 1.先在网上下载一个mongodb的安装包,再打开cmd命令,找到你装mongodb的文件的路径,进到mongodb的文件下的li ...

  4. 手贱,写个call玩玩.

    今天在睡觉醒时,突然感觉对call和apply有了点理解,但是又不好表达出来.就随便写几个例子. function say() { return this.role; } function Fathe ...

  5. Install hadoop on windows(non-virtual machine, such cygwin)

    DownloadBefore starting make sure you have this two softwares Hadoop 2.7.1 Java – Jdk 1.7+ Extract d ...

  6. Spring Batch批处理以及编程模型

    1.批处理: 类似于SQL里面的批处理提交 2.场景: 业务定时进行批处理操作,但是批处理的编程模型是怎么的呢? 3.开源框架 Spring Batch 4.编程模型: reader-processo ...

  7. php parse_str() 函数

    php parse_str() 函数把查询字符串解析到变量中,主要用于页面之间传值(参数).本文章向码农介绍php parse_str() 函数的使用方法,感兴趣的码农可以参考一下. 定义和用法 pa ...

  8. ATM+购物商城

    知识内容: 1.luffy买tesla 2.ATM+购物商城 一.luffy买tesla 需求: 1.目录结构说明 account luffy.json --> 存储用户账户信息 {" ...

  9. python之Web服务器案例

    HTTP协议简介 1. 使用谷歌/火狐浏览器分析 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来.而浏览器和服务器之间的传输协议是HTTP,所以: ...

  10. jdk下载--操作系统

    不同的操作系统需要下载不同的jdk. 查看操作系统的命令: Window系统下:>winver Linux和Unix系统下: >uname -a 根据系统不同选用不同的jdk: 下载地址: ...