洛谷P2053 修车
修车修到jiry报废(滑稽)
题意:m个人修n个车,同时开始。
每辆车只能给一个人修。每个人修每辆车的用时都不同。
问怎样安排能使每辆车的等待时间总和最少。
解:
一直想的是用以流量表示一个人,没想到是一流量表示一辆车......
答案统计也想错了...应该是统计每辆车修的时候对它以及它后面车的贡献。
比如当前这辆车的后面还有k辆,那么时间就要乘k + 1
每辆车可以给每个人修,后面可以安排任意辆车。据此拆点,把每个人拆成n个。
源点向车连边,车向每个人的后面有几辆车(一共m * n个点)连边,然后连到汇点。
跑最小费用最大流即可。
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- #include <cstring>
- const int N = , M = , INF = 0x3f3f3f3f;
- struct Edge {
- int nex, v, c, len;
- }edge[M << ]; int top = ;
- int e[N], d[N], vis[N], pre[N], flow[N];
- std::queue<int> Q;
- int G[][];
- inline void add(int x, int y, int z, int w) {
- top++;
- edge[top].v = y;
- edge[top].c = z;
- edge[top].len = w;
- edge[top].nex = e[x];
- e[x] = top;
- top++;
- edge[top].v = x;
- edge[top].c = ;
- edge[top].len = -w;
- edge[top].nex = e[y];
- e[y] = top;
- return;
- }
- inline bool SPFA(int s, int t) {
- memset(d, 0x3f, sizeof(d));
- d[s] = ;
- flow[s] = INF;
- vis[s] = ;
- Q.push(s);
- while(!Q.empty()) {
- int x = Q.front();
- Q.pop();
- vis[x] = ;
- for(int i = e[x]; i; i = edge[i].nex) {
- int y = edge[i].v;
- if(edge[i].c && d[y] > d[x] + edge[i].len) {
- d[y] = d[x] + edge[i].len;
- pre[y] = i;
- flow[y] = std::min(flow[x], edge[i].c);
- if(!vis[y]) {
- vis[y] = ;
- Q.push(y);
- }
- }
- }
- }
- return d[t] < INF;
- }
- inline void update(int s, int t) {
- int temp = flow[t];
- while(t != s) {
- int i = pre[t];
- edge[i].c -= temp;
- edge[i ^ ].c += temp;
- t = edge[i ^ ].v;
- }
- return;
- }
- inline int solve(int s, int t, int &cost) {
- int ans = ;
- cost = ;
- while(SPFA(s, t)) {
- ans += flow[t];
- cost += flow[t] * d[t];
- update(s, t);
- }
- return ans;
- }
- int m;
- inline int id(int x, int y) {
- return (x - ) * m + y;
- }
- int main() {
- int n;
- scanf("%d%d", &m, &n);
- for(int i = ; i <= n; i++) {
- for(int j = ; j <= m; j++) {
- scanf("%d", &G[i][j]);
- }
- }
- int s = (m + ) * n + ;
- int t = s + ;
- for(int a = ; a <= n; a++) {
- add(s, a, , );
- for(int j = ; j <= m; j++) {
- for(int i = ; i <= n; i++) {
- add(a, n + id(i, j), , i * G[a][j]);
- }
- }
- for(int j = ; j <= m; j++) {
- add(n + id(a, j), t, , );
- }
- }
- int ans;
- solve(s, t, ans);
- printf("%.2f", 1.0 * ans / n);
- return ;
- }
AC代码
洛谷P2053 修车的更多相关文章
- 洛谷 P2053 [SCOI2007]修车 解题报告
P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...
- [bzoj1070] [洛谷P2053] [SCOI2007] 修车
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- 洛谷 P2053 [SCOI2007]修车(最小费用最大流)
题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...
- 洛谷 P2053 [SCOI2007]修车
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- 洛谷$P2053\ [SCOI2007]$修车 网络流
正解:网络流 解题报告: 传送门$QwQ$ 一个很妙的建图,,,说实话我麻油想到$QwQ$ 考虑对每个工人建$n$个点,表示这是他修的倒数第$i$辆车,就可以算出影响是$t\cdot i$,然后对每辆 ...
- 【洛谷2053】 [SCOI2007]修车(费用流)
传送门 洛谷 Solution 考虑把每一个修车工人拆成\(n\)个点,那么考虑令\(id(i,j)\)为第\(i\)个工人倒数第\(j\)次修车. 然后就可以直接跑费用流了!!! 代码实现 /* m ...
- 【洛谷2050】 [NOI2012]美食节(费用流)
大家可以先看这道题目再做! SCOI2007修车 传送门 洛谷 Solution 就和上面那道题目一样的套路,但是发现你会获得60~80分的好成绩!!! 考虑优化,因为是SPFA,所以每一次只会走最短 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
随机推荐
- tf tensor 输出
在学习TensorFlow的过程中,我们需要知道某个tensor的值是什么,这个很重要,尤其是在debug的时候.也许你会说,这个很容易啊,直接print就可以了.其实不然,print只能打印输出sh ...
- MIT一牛人对数学在机器学习中的作用给的评述
MIT一牛人对数学在机器学习中的作用给的评述 转载自http://my.oschina.net/feedao/blog/52252,不过这个链接也是转载的,出处已经无从考证了. 感觉数学似乎总是不 ...
- Centos7下python3安装ipython
一.通过压缩包安装ipython 1.下载ipython安装包 [root@localhost ~]# wget https://pypi.python.org/packages/79/63/b671 ...
- springboot 设置 session 过期时间
application.properties server.session.timeout=86400 #单位(s) 这里是24小时
- idea java方法中 传多个参数对象 的复制粘贴快速处理方法
比如像这种的传多个参数对象,我是直接复制过来,然后把第一个字母改成大写,然后后面的实例对象敲一个第一个字符的小写,回车就直接出来了 在写调用参数的地方,ctrl+p 调出提示,然后按下提示里的实例的第 ...
- R绘图 第九篇:绘制散点图和气泡图(ggplot2)
绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ...
- PowerBI开发 第五篇:关系和交互
PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...
- CTE 递归查询全解
TSQL脚本能实现递归查询,用户使用共用表表达式 CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询.本文详细介绍CTE递归调用的特性和使用示例,递归查询 ...
- Redis发布订阅和事物笔记
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...
- Mvc4_mvc4跟mysql语法
mvc4: 子页面:@section A{} 母页面:@RenderSection("A",false) false:别的页面没有定义为A的Section的话 也没事,layout ...