P2488 [SDOI2011]工作安排 费用流
\(\color{#0066ff}{ 题目描述 }\)
你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小。由于我们并不想使用Special Judge,也为了使选手有更多的时间研究其他两道题目,你只需要输出最小的愤怒值之和就可以了。
\(\color{#0066ff}{输入格式}\)
\(\color{#0066ff}{输出格式}\)
仅输出一个整数,表示最小的愤怒值之和。
\(\color{#0066ff}{输入样例}\)
2 3
2 2 2
1 1 0
0 0 1
1
2
1 10
1
2
1 6
\(\color{#0066ff}{输出样例}\)
24
\(\color{#0066ff}{数据范围与提示}\)
\(\color{#0066ff}{ 题解 }\)
显然是个费用流
考虑怎么建边
愤怒值对于每个员工完成工作的数量来分段
完成工作数量? 这不就是从员工流出去多少流吗
所以,从S向员工,连多条边,每条边的容量为每段的长
这样愤怒值的问题就解决了
注意,每个任务不止完成一次
所以员工向任务连容量为inf的边,任务向T连容量为需要次数的边
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 1e5;
const LL inf = 999999999999999LL;
struct node {
int to;
LL dis, can;
node *nxt, *rev;
node(int to = 0, LL dis = 0, LL can = 0, node *nxt = NULL)
: to(to), dis(dis), can(can), nxt(nxt) {}
void *operator new (size_t) {
static node *S = NULL, *T = NULL;
return (S == T) && (T = (S = new node[1024]) + 1024), S++;
}
};
LL dis[maxn], change[maxn];
node *head[maxn], *road[maxn];
bool vis[maxn];
bool f[505][505];
int n, s, t, m;
std::vector<LL> v[maxn], d[maxn];
bool spfa() {
for(int i = s; i <= t; i++) dis[i] = inf, change[i] = inf;
std::queue<int> q;
dis[s] = 0;
q.push(s);
while(!q.empty()) {
int tp = q.front(); q.pop();
vis[tp] = false;
for(node *i = head[tp]; i; i = i->nxt)
if(dis[i->to] > dis[tp] + i->dis && i->can) {
dis[i->to] = dis[tp] + i->dis;
change[i->to] = std::min(change[tp], i->can);
road[i->to] = i;
if(!vis[i->to]) vis[i->to] = true, q.push(i->to);
}
}
return change[t] != inf;
}
LL mcmf() {
LL cost = 0;
while(spfa()) {
cost += change[t] * dis[t];
for(int o = t; o != s; o = road[o]->rev->to) {
road[o]->can -= change[t];
road[o]->rev->can += change[t];
}
}
return cost;
}
void add(int from, int to, LL dis, LL can) {
head[from] = new node(to, dis, can, head[from]);
}
void link(int from, int to, LL dis, LL can) {
add(from, to, dis, can);
add(to, from, -dis, 0);
head[from]->rev = head[to];
head[to]->rev = head[from];
}
int main() {
m = in(), n = in();
t = m + n + 1, s = 0;
for(int i = m + 1; i <= m + n; i++) link(i, t, 0, in());
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
if(in()) link(i, m + j, 0, inf);
for(int i = 1; i <= m; i++) {
int k = in();
v[i].push_back(0);
for(int j = 1; j <= k; j++) v[i].push_back(in());
v[i].push_back(inf);
for(int j = 1; j <= k + 1; j++) d[i].push_back(in());
for(int j = 0; j <= k; j++) link(s, i, d[i][j], v[i][j + 1] - v[i][j]);
}
printf("%lld", mcmf());
return 0;
}
P2488 [SDOI2011]工作安排 费用流的更多相关文章
- BZOJ 2245: [SDOI2011]工作安排( 费用流 )
费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...
- 【bzoj2245】[SDOI2011]工作安排 费用流
题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...
- [bzoj2245][SDOI2011]工作安排——费用流
题目大意: 传送门 题解: 很容易建模,把每一个工作人员拆成两个点,由第一个点向第二个点连S+1条边即可. 这水题没什么难度,主要是longlong卡的丧心病狂... 代码 #include < ...
- BZOJ 2245 SDOI 2011 工作安排 费用流
题目大意:有一些商品须要被制造.有一些员工.每个员工会做一些物品,然而这些员工做物品越多,他们的愤慨值越大,这满足一个分段函数.给出哪些员工能够做哪些东西,给出这些分段函数,求最小的愤慨值以满足须要被 ...
- bzoj 2245 [SDOI2011]工作安排(最小费用最大流)
2245: [SDOI2011]工作安排 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1197 Solved: 580[Submit][Statu ...
- 【BZOJ2245】[SDOI2011]工作安排(费用流)
[BZOJ2245][SDOI2011]工作安排(费用流) 题面 BZOJ 洛谷 题解 裸的费用流吧. 不需要拆点,只需要连边就好了,保证了\(W_j<W_{j+1}\). #include&l ...
- 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...
- [bzoj2245][SDOI2011]工作安排(费用流)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2245 分析: 要注意到题目下面说的w是单增的 明显的费用流: 弄个源点S,汇点T S连 ...
- [SDOI2011][bzoj2245] 工作分配 [费用流]
题面 传送门 思路 数据范围n,m<=250 分配任务问题 这是典型的"看到数据范围就知道算法"类型 而且我们发现我们要保证一定产出的情况下最小化花费 这句话等价于保证一定流 ...
随机推荐
- Redis codis 搭建测试
codis Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别,有部分命令支持 Codis ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 85
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 85;import sys reload(sys) sys.s ...
- 10-19C#基础--第四部分类型(2)重点
类型: 一.数字:Math类型 1)Math.Ceiling() ( 表示进位.));//只要小数点后有值,就向前进一位,取上限. string s = Console.ReadLine(); dou ...
- FMX 模态窗体
FMX 模态窗体 dlg := TForm2.Create(nil); dlg.ShowModal(procedure(ModalResult: TModalResult) begin ...
- MongoDB数据导入hbase + 代码
需求: 从mongoDB里面查出来数据,判断是否有该列簇,如果有则导入此条数据+列簇,如果没有,则该条数据不包含该列簇 直接贴出代码: package Test; import java.util.A ...
- python中注释的书写
与c和c++的//不同的是,在python中我们使用#来进行注释 每个#所在的那一行都可以叫做注释:
- ARQ
自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一.它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输.如果 ...
- css知多少(8)——float上篇(转)
1. 引言 对于我们所有的web前端开发人员,float是或者曾经一度是你最熟悉的陌生人——你离不开它,却整天承受着它所带给你的各种痛苦,你以为它很简单就那么一点知识,但却驾驭不了它各种奇怪的现象. ...
- go get
go get 命令用于从远程代码仓库(比如 Github )上下载并安装代码包.注意,go get 命令会把当前的代码包下载到 $GOPATH 中的第一个工作区的 src 目录中,并安装. 如果在 g ...
- GCD 学习(一)简介
文章摘抄至:http://zhuyanfeng.com/archives/3015 并有一些改动 GCD(Grand Central Dispatch)是从OS X Snow Leopard和iOS ...