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

思路:费用流。

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

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

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. javafx checkbox

    public class EffectTest extends Application { public static void main(String[] args) { launch(args); ...

  2. 跨域使用onmessage实现方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. CentOS7 NFS配置

    如果在安装Centos7时选择安装必要的开发工具选项,所以系统已经安好NFS必要的软件. 配置: # vi /etc/exports /home/qws/share 192.168.168.0/24 ...

  4. docker 部署 jenkins server

    1. 拉取一个jenkins 镜像 docker pull jenkins 2. 创建与jenkins配置目录对应的,容器外的,文件目录,并修改相应的权限 mkdir /home/jenkins ch ...

  5. 百度Echarts-免费的商业产品图表库

    官方网站:http://echarts.baidu.com/ 民间网站:http://fansunion.cn/echarts/ 下载地址:https://codeload.github.com/ec ...

  6. double 失真例子

    public static void main(String[] args) {  // TODO Auto-generated method stub  double ab=821.20;  dou ...

  7. Jquery学习总结(1)——Jquery常用代码片段汇总

    1. 禁止右键点击 ? 1 2 3 4 5 $(document).ready(function(){     $(document).bind("contextmenu",fun ...

  8. hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

    Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案 ...

  9. 设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)

    依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码 ...

  10. 多线程中的&quot;断点&quot;续传《notify()和wait()》

    眼下在做一个项目.关于软件管理与下载的,预计项目提交日期定在6月9号.项目做了有20天了,可是在一个功能上卡住了.在这个项目中有一个功能----APK的下载须要实现. 相信大家都玩过非常多关于下载AP ...