题目大意:有一些商品须要被制造。有一些员工。每个员工会做一些物品,然而这些员工做物品越多,他们的愤慨值越大,这满足一个分段函数。给出哪些员工能够做哪些东西,给出这些分段函数,求最小的愤慨值以满足须要被制造的商品。

思路:费用流。

我写的朴素费用流好像非常慢,有时间学一学费用流的多路增广。

因为题目中满足那些分段函数是满足单调递增的性质的,所以就能够例如以下建图:

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 工作安排 费用流的更多相关文章

  1. BZOJ 2245: [SDOI2011]工作安排( 费用流 )

    费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...

  2. 【bzoj2245】[SDOI2011]工作安排 费用流

    题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...

  3. P2488 [SDOI2011]工作安排 费用流

    \(\color{#0066ff}{ 题目描述 }\) 你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小.由于我们并不想使用Special Judge,也为了使选手 ...

  4. 【BZOJ 2245】[SDOI2011]工作安排

    Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产 ...

  5. [bzoj2245][SDOI2011]工作安排——费用流

    题目大意: 传送门 题解: 很容易建模,把每一个工作人员拆成两个点,由第一个点向第二个点连S+1条边即可. 这水题没什么难度,主要是longlong卡的丧心病狂... 代码 #include < ...

  6. 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)

    从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...

  7. BZOJ 3876 支线剧情 | 有下界费用流

    BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...

  8. [BZOJ 1221] [HNOI2001] 软件开发 【费用流 || 三分】

    题目链接:BZOJ - 1221 题目分析 算法一:最小费用最大流 首先这是一道经典的网络流问题.每天建立两个节点,一个 i 表示使用毛巾,一个 i' 表示这天用过的毛巾. 然后 i 向 T 连 Ai ...

  9. BZOJ 1061 [Noi2008]志愿者招募(费用流)

    题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...

随机推荐

  1. 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序

    原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...

  2. POJ 3049 DFS

    思路:暴搜 //By SiriusRen #include <cstdio> #include <iostream> #include <algorithm> us ...

  3. centos配置tomcat编辑修改

    https://jingyan.baidu.com/article/6525d4b1382f0aac7d2e9421.html

  4. angular路由(自带路由篇)

    一.angular路由是什么? 为了实现SPA多视图的切换的效果,其原理可简述为每个 URL 都有对应的视图和控制器.所以当我们给url后面拼上不同的参数就能通过路由实现不同视图的切换. 二.文件总览 ...

  5. matplotlib散点图笔记

    定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import ...

  6. 雅黑PHP探针 For PHP7

    雅黑PHP探针 For PHP7资料来源: https://kn007.net/topics/yahei-php-probe-for-php7/在v0.4.7版本的基础上,修正了废弃函数及错误语法.使 ...

  7. Spring中JDBCTemplate的入门

    Spring是IOC和AOP的容器框架,一站式的框架 连接数据库的步骤:[必须会写] Spring当中如何配置连接数据库? 第一步配置核心配置文件: <?xml version="1. ...

  8. Java学习笔记七 常用API对象三

    一.泛型:简单说就是对对象类型进行限定的技术 public class GenericDemo { public static void main(String[] args){ /*泛型作为1.5版 ...

  9. 斜率优化dp练习

    1.HDU3507 裸题,有助于理解斜率优化的精髓. dp[i]=min(dp[j]+m+(sum[i]-sum[j])2) 很显然不是单调队列. 根据斜率优化的的定义,就是先设两个决策j,k 什么时 ...

  10. CISP/CISA 每日一题 14

    CISA 每日一题(答) 自动无人值守运行(LIGHTS-OUT)优势:1.信息系统运行成本的遏制/减少:2.持续运行(24/7):3.减少系统错误和中断次数. I/O 控制人员负责保证:1.批处理信 ...