1070: [SCOI2007]修车

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

——我是愉快的分隔符——

本题一眼的费用流。
考虑每个工人,若工人修某辆车,则等待总时间是这个工人的修理时间*剩余车辆数。
所以可以将每辆车与源点连边,流量为1,费用为0,控制每辆车只被修一次。
每个工人拆成N个点,分别与汇点相连,流量为1,费用为0,控制工人在同一时间修理一次;
每辆车和每个工人对应的时间相连,流量为1,费用为车子的倒数数*修理时间。
一边费用流直接出。

下面是代码:

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int m,n;
int t[65][10];const int Maxm=100000;//最大边数
const int Maxn=1000;//最大点数
struct Edge{Edge(){};Edge(int a,int b,int c,int d,int e){u=a;v=b; f=c;w=d;nxt=e;}int u,v,f,w,nxt;//U当前点 V来自点 F最大流量 W费用 NXT下一个点
};
int cnt=1;//边计数
int inf=2147483647;//无限大
int g[Maxn+10];//点的边集的开始序号
Edge e[Maxm+10];//边集
int dist[Maxn+10];//费用
int src,sink;//源点与汇点
queue<int> que;//宽搜队列
bool inque[Maxn+10];//宽搜判断标志
int from[Maxn+10];//来源->用于计算费用
int ans=0;//存储最小费用 inline int remin(int a,int b){return a<b?a:b;
}inline void insert(int u,int v,int f,int w){cnt++;e[cnt]=Edge(u,v,f,w,g[u]);g[u]=cnt;//增加一个边
} inline void addEdge(int u,int v,int f,int w){insert(u,v,f,w);//插入正边 insert(v,u,0,-w);//插入反边
}inline bool spfa(){while (!que.empty()) que.pop();//清空队列 for (int i=0;i<=sink;i++) dist[i]=inf;//清最大值que.push(src);inque[src]=true;dist[src]=0;//加入源点//标准SPFA计算最短路 流量作为通行标准,费用作为路径长度 while(!que.empty()){int now=que.front();que.pop();for (int i=g[now];i;i=e[i].nxt){if (e[i].f!=0 && dist[e[i].v]>dist[now]+e[i].w){dist[e[i].v]=dist[now]+e[i].w;from[e[i].v]=i;if (inque[e[i].v]==false){inque[e[i].v]=true;que.push(e[i].v);}}}inque[now]=false;} if (dist[sink]==inf) return false;//无法在增广 return true;
}inline void calcAns(){int minflow=inf;for (int i=from[sink];i;i=from[e[i].u]) minflow=remin(minflow,e[i].f);//寻找整条路经的流量 for (int i=from[sink];i;i=from[e[i].u]) {e[i].f-=minflow;//正边减流量 e[i^1].f+=minflow;//反边加流量 ans+=e[i].w*minflow;//计算费用 }
}inline void minCostFlow(){while(spfa())calcAns();
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)scanf("%d",&t[i][j]);src=0;//设置源点 sink=1001;//设置汇点 //建边 for(int i=1;i<=n*m;i++)addEdge(src,i,1,0);for(int i=n*m+1;i<=n*m+m;i++)addEdge(i,sink,1,0);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=1;k<=m;k++)addEdge((i-1)*m+j,n*m+k,1,t[k][i]*j);minCostFlow();printf("%.2lf",(double)ans/m);return 0;
}

转载于:https://www.cnblogs.com/WNJXYK/p/4063967.html

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

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

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

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

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

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

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

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

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

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

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

  6. 1070: [SCOI2007]修车

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

  7. BZOJ 1070 拆点 费用流

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

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

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

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

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

最新文章

  1. 知乎:GAN 的发展对于研究通用人工智能有什么意义?
  2. NLog-ASP.NET Core 5入门
  3. Win32程序设计(Windows程序设计机理)
  4. win8:querySelector()方法
  5. 计算机上机计划,计算机上机实验内容及实验报告总结计划要求-20210711144121.doc-原创力文档...
  6. [高级]性能分析工具TraceView
  7. 「镁客·请讲」亮亮视野吴斐:行业应用体现AR硬件的价值本质
  8. C51行列键盘扫描程序
  9. 如何手动彻底消除U盘使用痕迹
  10. ERP基础数据 华夏
  11. python二元一次方程组用鸡兔同笼的思路来写编程_二元一次方程组应用 —鸡兔同笼...
  12. Linux--1 初识
  13. 如何制作网络视频投票?
  14. python打印等腰三角形_Python 打印各种三角形
  15. Vu单元测试-------笔记(一)
  16. 影之刃服务器维护,《影之刃3》骨灰级玩家给大家带来一条龙攻略服务
  17. 【NLP】LTP中文工具集使用
  18. Cocos2d-x 3
  19. 24c02存储器(iic通信协议)
  20. 【Python学习笔记】(十)邮件处理:email模块;SMTP协议(smtplib模块);POP3协议(poplib模块);IMAP协议(imaplib模块)

热门文章

  1. 8102年底如何开发和维护一个npm项目
  2. HTML - label (转)
  3. 虚拟主机-多域名多目录使用方法
  4. 两种不同字符串比较方法的性能对比
  5. 一种极端思维引起的幻觉
  6. 1091 N-自守数 (15分)
  7. 同一个电脑安装几个MATLAB,同一个版本的matlab、同一个.m文件,为何一个顺利执行、另一个出错?...
  8. 课节5:图神经网络算法(二):领居聚合
  9. 命名实体识别(NER)资料收集
  10. eclipse修改工作的目录顺序