1070: [SCOI2007]修车

Time Limit: 1 SecMemory Limit: 162 MB

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)

【题解】

设time[i][j]表示第i部车被第j个修理人员修的时间.

把每个维修人员拆成n个点,表示是倒数第几个修的.再建n个点表示n部车.

那么如果第i部车,是在第j个维修人员那里作为倒数第z个修,那么就像i->(j,z)连一条费用(影响)是 time[i][j]*z (要加上自己的哦.),容量为1的边.

再向源点到n部车的点连一条容量为1费用为0的边,表示每部车只有一辆.

每个表示第j个维修人员,倒数第z个修的点(j,z)向汇点连一条容量为1费用为0的边,表示第j个维修人员,倒数第z个修的车,只能有一辆.

这构图真是机智。。。然而我太弱了只好多见识见识机智的构图模型咯

现在费用流写的有点熟了呢~

 1 #include <stdio.h>
 2 #include <queue>
 3 #include <string.h>
 4 using namespace std;
 5 const int B=200100;
 6 int head[B], timx[1010][1010], S, T, n, m, cnt=-1, next[B], to[B], w[B], flow[B], d[B], pre[B];
 7 bool vis[B];
 8 int oq[B];
 9 int ans;
10 double ans2;
11 queue<int> q;
12
13 inline void qclean() {
14     while(!q.empty()) q.pop();
15 }
16 inline void addf(int u,int v,int _flow,int _w) {
17     ++cnt;
18     to[cnt]=v;
19     next[cnt]=head[u];
20     head[u]=cnt;
21     flow[cnt]=_flow;
22     w[cnt]=_w;
23 }
24 inline void add(int u,int v,int _flow,int _w) {
25     addf(u,v,_flow,_w);
26     addf(v,u,0,-_w);
27 }
28 inline bool spfa() {
29     qclean();
30     memset(d,0X7f,sizeof(d));
31     memset(vis,0,sizeof(vis));
32     memset(oq,0,sizeof(oq));
33     memset(pre,-1,sizeof(pre));
34     pre[S]=-1; d[S]=0; vis[S]=1; q.push(S);
35     while(!q.empty()) {
36         int top=q.front(); q.pop();
37         vis[top]=0;
38         for (int i=head[top];i>=0;i=next[i]) {
39             if(d[top]+w[i]<d[to[i]]&&flow[i]) {
40                 d[to[i]]=d[top]+w[i];
41                 pre[to[i]]=i;
42                 if(!vis[to[i]]) {
43                     vis[to[i]]=1;
44                     q.push(to[i]);
45                 }
46             }
47         }
48     }
49     return pre[T]!=-1;
50 }
51 inline void mcf() {
52     int xm=1e9;
53     for (int k=pre[T];k>=0;k=pre[to[k^1]])
54         xm=min(xm,flow[k]);
55     for (int k=pre[T];k>=0;k=pre[to[k^1]]) {
56         flow[k]-=xm;
57         flow[k^1]+=xm;
58         ans+=xm*w[k];
59     }
60 }
61 int main() {
62     scanf("%d%d",&m,&n);
63     S=0; T=n*m+n+1;
64     memset(head,-1,sizeof(head));
65     for (int i=1;i<=n;++i)
66         for (int j=1;j<=m;++j) scanf("%d",&timx[i][j]);
67     for(int i=1;i<=n;i++) add(S,i,1,0);
68     for(int i=n+n*m;i>=n+1;i--) add(i,T,1,0);
69     for(int i=1;i<=n;i++)
70         for(int j=1;j<=m;j++)
71             for(int k=1;k<=n;k++)
72                  add(i,j*n+k,1,(n-k+1)*timx[i][j]);
73     while(spfa()) mcf();
74     printf("%.2lf\n",(double)ans/n);
75     return 0;
76 }

View Code

转载于:https://www.cnblogs.com/TonyNeal/p/bzoj1070.html

[BZOJ 1070] [SCOI2007] 修车相关推荐

  1. BZOJ 1070: [SCOI2007]修车(最小费用最大流)

    建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cs ...

  2. BZOJ 1070: [SCOI2007]修车

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

  3. [BZOJ 1070][SCOI2007]修车(费用流)

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

  4. BZOJ 1070: [SCOI2007]修车(费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...

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

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

  6. 【BZOJ】1070: [SCOI2007]修车

    1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...

  7. 1070: [SCOI2007]修车

    /*一开始以为是个贪心 发现自己太naive了将每个技术工人拆成n个点,一共拆n*m个,第i个表示倒数第i次修车. 让每辆车向拆出来的点连边,费用为tmp[i][j]*k,i是技工,j是车,k是拆出来 ...

  8. BZOJ 1070 拆点 费用流

    1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 5860  Solved: 2487 [Submit][Statu ...

  9. bzoj 1070【scoi2007】修车(网络流)

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

  10. luogu P2053 [SCOI2007]修车(费用流提前计算)

    P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...

最新文章

  1. [Unity3D]总结使用Unity 3D优化游戏运行性能的经验
  2. 深度信念网络Deep Belief Networks资料汇总
  3. 通用类别目录Global Catalog[为企业维护windows server 2008系列五]
  4. OSS网页上传和断点续传(终结篇)
  5. 分布式锁的多种实现方式
  6. 2018/11/29 一个64位操作系统的设计与实现 03 (在Bochs上运行Boot程序)
  7. 安装openstack时遇到的错误
  8. 使用 idea 创建第一个 springboot 项目
  9. java URL连接ftp_java – URLConnection FTP列表文件
  10. STM32F103:一.(3)IO方向
  11. 前端后台与接口的问题
  12. YII 利用Clip构建layout
  13. js实现调用摄像头拍照功能
  14. 群晖Nas通过jellyfin搭建本地影音库详细全过程(一):通过群晖系统docker容器安装jellyfin影音库服务器
  15. 计算机网上邻居怎么隐藏,Win7桌面不显示网上邻居图标方法 win7系统如何隐藏网上邻居图标...
  16. 利用东方财富网获取股票代码
  17. 华为员工工作生活及待遇全面揭秘
  18. 工程制图计算机绘图实训总结感悟,工程制图心得体会.doc
  19. 说一说程序员如何保持平常心
  20. ih5长图如何滑动_iH5中级教程微场景H5必备,滑动时间轴+轨迹.doc

热门文章

  1. java 表格添加监听_关于Oracle用java实时监听oracle对表的DML操作【技术贴】
  2. JVM学习03-常用Java虚拟机参数
  3. android 时间函数 性能,Android 性能优化——启动时间优化
  4. 【渝粤教育】国家开放大学2018年秋季 0053-22T移动通信技术与移动通信设备 参考试题
  5. 博弈论(一)基本概念
  6. eclipse 添加jar (servlet api)
  7. MySQL从查找数据库表到删除全过程
  8. spring配置文件中导入约束的详细步骤
  9. 大纲2.1 计算机网络
  10. SV fork-join