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

思路:费用流。

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

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

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. sql中去掉换行符和回车符

    sql 中,char(13),char(10)或nchar(13),nchar(10)可表示SQL中的回车换行符,但是会以空格的形式显示.replace(replace(字段名,char(10), ' ...

  2. 最大子矩阵和 51Nod 1051 模板题

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:3*3的矩阵:   -1 3 -1 2 -1 3 -3 1 2   和最大的子矩阵是:   3 - ...

  3. nodejs学习(三)--express连接mysql数据库,mysql查询封装

    一.说一下 连接不同的数据库需要安装相应的插件,此demo使用mysql数据库,需自行安装mysql数据库软件. 新建数据库webapp, 新建表users: 二.直接开码 npm install m ...

  4. shell项目-分发系统-构建文件分发系统

    shell项目-分发系统-构建文件分发系统 需求背景对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台.所以,自动同步文件是至关重要的. 实 ...

  5. [ReasonML] Named & optional params

    // ::country is named param // ::country=?: which make it optional // because we make ::country=? op ...

  6. POJ 1101 The Game(BFS+判方向)

        The Game Description One morning, you wake up and think: "I am such a good programmer. Why ...

  7. Git管理软件

    软件下载地址 首先下载库 https://code.google.com/p/msysgit/ 接着安装 https://code.google.com/p/tortoisegit/ 然后就能够用了

  8. linux 批量设置文件夹755 文件644权限

    linux 批量设置文件夹755 文件644权限 文件来源 http://www.111cn.net/sys/linux/109724.htm 本文章来为各位介绍一篇关于linux 批量设置文件夹75 ...

  9. Fedora 13 Alpha测试手记横空出世

    本文转载在:http://www.linux521.com/2009/system/201004/10719.html   本文是继<Fedora 11-Alpha试用手记>文章(http ...

  10. Shelled-out Commands In Golang

    http://nathanleclaire.com/blog/2014/12/29/shelled-out-commands-in-golang/ Shelled-out Commands In Go ...