BZOJ 2245 SDOI 2011 工作安排 费用流
题目大意:有一些商品须要被制造。有一些员工。每个员工会做一些物品,然而这些员工做物品越多,他们的愤慨值越大,这满足一个分段函数。给出哪些员工能够做哪些东西,给出这些分段函数,求最小的愤慨值以满足须要被制造的商品。
思路:费用流。
我写的朴素费用流好像非常慢,有时间学一学费用流的多路增广。
因为题目中满足那些分段函数是满足单调递增的性质的,所以就能够例如以下建图:
S->每一个人,费用0,流量INF
每一个商品->T,费用0,流量为须要改商品的数量
对于每一个人虚拟建n个节点(n<=5)
每一个人->虚拟节点。费用为分段函数的值,流量INF
每一个人的虚拟节点->那个人可以做出的商品。费用0。流量INF
这样跑EK费用流就能够了。
CODE:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 2010
#define MAXE 600010
#define INF 0x3f3f3f3f
#define S 0
#define T (MAX - 1)
using namespace std; int persons,staffs;
bool work[300][300]; int head[MAX],total = 1;
int next[MAXE],aim[MAXE],flow[MAXE],cost[MAXE]; int src[MAX]; int f[MAX],p[MAX],from[MAX];
bool v[MAX]; inline void Add(int x,int y,int f,int c);
long long EdmondsKarp();
bool SPFA(); int main()
{
cin >> persons >> staffs;
for(int i = 1;i <= persons; ++i) {
Add(S,i,INF,0);
Add(i,S,0,0);
}
for(int x,i = 1;i <= staffs; ++i) {
scanf("%d",&x);
Add(i + persons,T,x,0);
Add(T,i + persons,0,0);
}
for(int i = 1;i <= persons; ++i)
for(int j = 1;j <= staffs; ++j)
scanf("%d",&work[i][j]);
int now = persons + staffs;
for(int cnt,i = 1;i <= persons; ++i) {
scanf("%d",&cnt);
for(int j = 1;j <= cnt; ++j)
scanf("%d",&src[j]);
src[cnt + 1] = INF;
for(int x,j = 1;j <= cnt + 1; ++j) {
scanf("%d",&x);
Add(i,++now,src[j] - src[j - 1],x);
Add(now,i,src[j] - src[j - 1],-x);
for(int k = 1;k <= staffs; ++k)
if(work[i][k]) {
Add(now,persons + k,INF,0);
Add(persons + k,now,0,0);
}
}
}
cout << EdmondsKarp() << endl;
return 0;
} inline void Add(int x,int y,int f,int c)
{
next[++total] = head[x];
aim[total] = y;
flow[total] = f;
cost[total] = c;
head[x] = total;
} long long EdmondsKarp()
{
long long re = 0;
while(SPFA()) {
int remain = INF;
for(int i = T;i != S;i = from[i])
remain = min(remain,flow[p[i]]);
for(int i = T;i != S;i = from[i]) {
flow[p[i]] -= remain;
flow[p[i]^1] += remain;
}
re += f[T] * remain;
}
return re;
} bool SPFA()
{
static queue<int> q;
while(!q.empty()) q.pop();
q.push(S);
memset(f,0x3f,sizeof(f));
memset(v,false,sizeof(v));
f[S] = 0;
while(!q.empty()) {
int x = q.front(); q.pop();
v[x] = false;
for(int i = head[x];i;i = next[i])
if(flow[i] && f[aim[i]] > f[x] + cost[i]) {
f[aim[i]] = f[x] + cost[i];
if(!v[aim[i]]) {
v[aim[i]] = true;
q.push(aim[i]);
}
from[aim[i]] = x;
p[aim[i]] = i;
}
}
return f[T] != 0x3f3f3f3f;
}
BZOJ 2245 SDOI 2011 工作安排 费用流的更多相关文章
- BZOJ 2245: [SDOI2011]工作安排( 费用流 )
费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...
- 【bzoj2245】[SDOI2011]工作安排 费用流
题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...
- P2488 [SDOI2011]工作安排 费用流
\(\color{#0066ff}{ 题目描述 }\) 你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小.由于我们并不想使用Special Judge,也为了使选手 ...
- 【BZOJ 2245】[SDOI2011]工作安排
Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产 ...
- [bzoj2245][SDOI2011]工作安排——费用流
题目大意: 传送门 题解: 很容易建模,把每一个工作人员拆成两个点,由第一个点向第二个点连S+1条边即可. 这水题没什么难度,主要是longlong卡的丧心病狂... 代码 #include < ...
- 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)
从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...
- BZOJ 3876 支线剧情 | 有下界费用流
BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...
- [BZOJ 1221] [HNOI2001] 软件开发 【费用流 || 三分】
题目链接:BZOJ - 1221 题目分析 算法一:最小费用最大流 首先这是一道经典的网络流问题.每天建立两个节点,一个 i 表示使用毛巾,一个 i' 表示这天用过的毛巾. 然后 i 向 T 连 Ai ...
- BZOJ 1061 [Noi2008]志愿者招募(费用流)
题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...
随机推荐
- Spark Tachyon实战应用(配置启动环境、运行spark和运行mapreduce)
Tachyon实战应用 配置及启动环境 修改spark-env.sh 启动HDFS 启动Tachyon Tachyon上运行Spark 添加core-site.xml 启动Spark集群 读取文件并保 ...
- DbSet<>.Find()
第一篇为大家带来新的API,DbSet<>.Find(). 过去我们常常用Where或First(FirstOrDefault)方法来查找对应的实体,比如: var people = fr ...
- js对象基础写法练习
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- locate---查找文件
- 【Codeforces Round #427 (Div. 2) D】Palindromic characteristics
[Link]:http://codeforces.com/contest/835/problem/D [Description] 给你一个字符串; 让你在其中找到1..k阶的回文子串; 并统计它们的数 ...
- 【Codeforces Round #427 (Div. 2) B】The number on the board
[Link]:http://codeforces.com/contest/835 [Description] 原本有一个数字x,它的各个数码的和原本是>=k的; 现在这个数字x,在不改变位数的情 ...
- Windows学习总结(3)——成为电脑高手必备的cmd命令大全
曾经看电影和电视里面电脑黑客快速敲击电脑键盘,一行行命令在电脑屏幕闪过,一个回车过后,一排排英文象走马灯一样在屏幕上转瞬即逝,那才是我们梦寐以求的高手,有木有!实际上,不光是黑客和系统维护人员,一般的 ...
- HDU——T 2594 Simpsons’ Hidden Talents
http://acm.hdu.edu.cn/showproblem.php?pid=2594 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- mac下的词典翻译快捷键
mac下的词典翻译快捷键:cmd+ctl+d;很方便
- BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...