P2050 [NOI2012]美食节
题目地址:P2050 [NOI2012]美食节
先来讲一下P2053 [SCOI2007]修车(如果会做请跳过)
同一时刻有 \(N\) 位车主带着他们的爱车来到了汽车维修中心。维修中心共有 \(M\) 位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这 \(M\) 位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。
说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
\(2 \leq M \leq 9,1 \leq N \leq 60,1 \leq T \leq 1000\) 。
费用提前计算
注意到每位车主的等待时间除了跟自己的车所需的维修时间有关之外,还跟同一位技术人员之前维修所花的时间有关,这导致我们很难直观地建模。
但是仔细观察可以发现,一个人维修所花的时间,对同一位技术人员之后的维修造成的影响是已知且固定的。
那么,我们将费用提前计算,即,把第 \(i\) 位车主的车由第 \(j\) 位维修人员倒数第 \(k\) 个维修所花的时间(费用)当作 \(k \times t_{i,j}\) 。
从源点向每位车主连边,容量为 \(1\) ,费用为 \(0\) 。
每位维修人员拆成 \(n\) 个点,向汇点连边,容量为 \(1\) ,费用为 \(0\) 。
第 \(i\) 位车主向第 \(j\) 位维修人员拆成的第 \(k\) 个点连边,容量为 \(1\) ,费用为 \(k \times t_{i,j}\) 。
求最小费用最大流即可。
此题为 P2053 [SCOI2007]修车 的数据加强版。
\(N \leq 40,M \leq 100\) 。
同 P2053 [SCOI2007]修车 的建图方式,但是硬求最小费用最大流只能拿到 \(60\) 分。
动态开点
起初每个厨师只拆成一个点,每次增广时,把当下的厨师拆出一个新点。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 6, M = 4e7 + 6, inf = 0x3f3f3f3f;
int n, m, s, t, ans, d[N], pre[N], now[N], num, p[N];
int Head[N], Edge[M], Leng[M], Cost[M], Next[M], tot = 1;
bitset<N> v;
int a[46][106];
inline void add(int x, int y, int z, int w) {
Edge[++tot] = y;
Leng[tot] = z;
Cost[tot] = w;
Next[tot] = Head[x];
Head[x] = tot;
}
inline bool spfa() {
v.reset();
memset(d, 0x3f, sizeof(d));
queue<int> q;
q.push(s);
v[s] = 1;
d[s] = 0;
now[s] = inf;
while (q.size()) {
int x = q.front();
q.pop();
v[x] = 0;
for (int i = Head[x]; i; i = Next[i]) {
int y = Edge[i], z = Leng[i], w = Cost[i];
if (!z || d[y] <= d[x] + w) continue;
d[y] = d[x] + w;
now[y] = min(now[x], z);
pre[y] = i;
if (!v[y]) {
q.push(y);
v[y] = 1;
}
}
}
return d[t] != inf;
}
inline void upd() {
ans += d[t] * now[t];
int x = t;
while (x != s) {
int i = pre[x];
Leng[i] -= now[t];
Leng[i^1] += now[t];
x = Edge[i^1];
}
x = Edge[pre[t]^1];
p[++num] = p[x];
add(num, t, 1, 0);
add(t, num, 0, 0);
for (int i = Head[x]; i; i = Next[i]) {
int y = Edge[i], w = Cost[i^1];
if (y == t) continue;
w += a[y][p[x]];
add(y, num, 1, w);
add(num, y, 0, -w);
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
add(0, i, x, 0);
add(i, 0, 0, 0);
}
num = t = n + m + 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
int x;
scanf("%d", &x);
a[i][j] = x;
add(i, n + j, 1, x);
add(n + j, i, 0, -x);
}
for (int i = 1; i <= m; i++) {
add(n + i, t, 1, 0);
add(t, n + i, 0, 0);
p[n+i] = i;
}
while (spfa()) upd();
cout << ans << endl;
return 0;
}
P2050 [NOI2012]美食节的更多相关文章
- P2050 [NOI2012]美食节(费用流)
P2050 [NOI2012]美食节 P2053 [SCOI2007]修车的加强版 因为数据较大,一次性把所有边都加完会T 于是我们每次只连需要的边跑费用流 就是开始先连所有厨师做倒数第1道菜 跑费用 ...
- 洛谷P2050 [NOI2012]美食节
动态加边网络流 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
- P2050 [NOI2012]美食节 动态连边优化费用流
题意 类似的一道排队等候,算最小总等待时间的题目. 思路 但是这道题的边数很多,直接跑会tle,可以动态加边,就是先连上倒数第一次操作的边,跑一遍费用流,然后对使用了倒数第一条边的点,连上相应的倒数第 ...
- P2050 [NOI2012]美食节 动态加边加点
修车数据加强版 需要动态加边加点 #include<bits/stdc++.h> using namespace std; const int INF = 0x7f7f7f7f; , MA ...
- 洛谷$P2050\ [NOI2012]$美食节 网络流
正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- BZOJ 2879: [Noi2012]美食节 最小费用流 动态添边
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 324 Solved: 179[Submit][Status] ...
- BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )
倒着做菜..然后考虑为当前的人做菜对后面的人的影响就可以了..要动态加边 --------------------------------------------------------------- ...
- 【BZOJ2879】[Noi2012]美食节 动态加边网络流
[BZOJ2879][Noi2012]美食节 Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食 ...
随机推荐
- python字节(bytes)
在 3.x 中,字符串和二进制数据完全区分开.文本总是 Unicode,由 str 类型表示,二进制数据则由 bytes 类型表示.Python 3 不会以任意隐式的方式混用 str 和 bytes, ...
- eclipse新建maven项目默认jre为1.5的问题
在maven的settings.xml中添加如下内容解决 <profiles> <profile> <id>jdk-1.8</id> <activ ...
- MySQL5.7延迟复制半同步复制
MySQL5.7延迟复制半同步复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.延迟复制 1>.什么是延迟复制 延迟复制是指定从库对主库的延迟至少是指定的这个间隔时间 ...
- mysql 遍历所有的库并根据表和sql语句备份
建库.用户语句 create database test_hb; create user ' test_hb'@'%' identified by '123456'; grant all privil ...
- MySQL数据类型1
1.float.double.decimal类型用法详解 三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型, ...
- 关于js事件执行顺序
关于js事件执行顺序小技巧 js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 ...
- javaScript ES5常考面试题总结
js的六种原始值 boolean null undefined number string symbol 坑1: 首先原始类型存储的都是值,是没有函数可以调用的,比如 undefined.toStri ...
- 记录MySQL的一些基础操作
MySQL建表操作 root@localhost 08:05:22> create table stu( -> id int(4) not null, -> name char(20 ...
- Android五大布局
原文地址:http://blog.51cto.com/liangruijun/632532 https://www.cnblogs.com/devinzhang/archive/2012/01/19/ ...
- JDK8新特性01 Lambda表达式01_设计的由来
1.java bean public class Employee { private int id; private String name; private int age; private do ...