题目大意:

传送门

题解:

很容易建模,把每一个工作人员拆成两个点,由第一个点向第二个点连S+1条边即可。

这水题没什么难度,主要是longlong卡的丧心病狂。。。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2550;
const ll maxv = maxn * 10;
const ll inf = 1000000000000;
ll dist[maxv], inq[maxv], pree[maxv], fl[maxv];
struct edge {
ll from;
ll to;
ll cap;
ll cost;
};
vector<edge> edges;
vector<ll> G[maxv];
ll n, m, a[maxn][maxn], c[maxn], v;
void add_edge(ll from, ll to, ll cap, ll cost) {
edges.push_back((edge){from, to, cap, cost});
edges.push_back((edge){to, from, 0, -cost});
ll m = edges.size();
G[from].push_back(m - 2);
G[to].push_back(m - 1);
}
bool spfa(ll s, ll t, ll &cost) {
for (int i = 0; i < v; i++)
dist[i] = inf;
memset(inq, 0, sizeof(inq));
memset(pree, 0, sizeof(pree));
memset(fl, 0, sizeof(fl));
queue<ll> q;
fl[s] = inf;
dist[s] = 0, inq[s] = 1;
q.push(s);
while (!q.empty()) {
ll u = q.front();
q.pop();
inq[u] = 0;
for (int i = 0; i < G[u].size(); i++) {
edge &e = edges[G[u][i]];
if (e.cap > 0 && dist[e.to] > dist[u] + e.cost) {
dist[e.to] = dist[u] + e.cost;
pree[e.to] = G[u][i];
fl[e.to] = min(fl[u], e.cap);
if (!inq[e.to]) {
q.push(e.to);
inq[e.to] = 1;
}
}
}
}
if (dist[t] >= inf)
return false;
ll flow = fl[t];
cost += flow * dist[t];
ll u = t;
while (!u == s) {
edges[pree[u]].cap -= flow;
edges[pree[u] ^ 1].cap += flow;
u = edges[pree[u]].from;
}
return true;
}
ll mcmf(int s, int t) {
ll cost = 0;
while (spfa(s, t, cost))
;
return cost;
}
void solve() {
// 1-m:员工
// m+1~m+n 产品
// m+n+1~m+n+m 拆点后的员工
scanf("%lld %lld", &m, &n);
ll s = 0, t = n + m + m + 1;
v = t + 1; for (int i = 1; i <= n; i++) {
scanf("%lld", &c[i]);
add_edge(m + i, t, c[i], 0);
}
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++) {
int x;
scanf("%d", &x);
if (x)
add_edge(i, j + m, inf, 0);
}
for (int i = 1; i <= m; i++) {
add_edge(s, n + m + i, inf, 0);
ll s;
scanf("%lld", &s);
ll T[maxn];
T[0] = 0;
for (int j = 1; j <= s; j++)
scanf("%lld", &T[j]);
for (int j = 1; j <= s; j++) {
ll y;
scanf("%lld", &y);
add_edge(n + m + i, i, T[j] - T[j - 1], y);
}
scanf("%lld", &s);
add_edge(n + m + i, i, inf, s);
}
ll ans = mcmf(s, t);
printf("%lld\n", ans);
}
int main() {
// freopen("input", "r", stdin);
solve();
}

[bzoj2245][SDOI2011]工作安排——费用流的更多相关文章

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

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

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

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

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

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

  4. [bzoj2245][SDOI2011]工作安排(费用流)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2245 分析: 要注意到题目下面说的w是单增的 明显的费用流: 弄个源点S,汇点T S连 ...

  5. bzoj2245: [SDOI2011]工作安排

    费用流. 这道题的模型比较明显,拆点也是很容易看出来的. #include<cstdio> #include<algorithm> #include<cstring> ...

  6. BZOJ 2245 SDOI 2011 工作安排 费用流

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

  7. BZOJ2245 [SDOI2011]工作安排 【费用流】

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

  8. 【BZOJ2245】[SDOI2011]工作安排(费用流)

    [BZOJ2245][SDOI2011]工作安排(费用流) 题面 BZOJ 洛谷 题解 裸的费用流吧. 不需要拆点,只需要连边就好了,保证了\(W_j<W_{j+1}\). #include&l ...

  9. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流

    [BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...

随机推荐

  1. Django项目发布到Apache2.4配置mod_wsgi,解决遭遇的各种坑。

    环境: Apache2.4 32bit Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Inte ...

  2. shell+vim——05

    ln --->link 链接, 链接有两种: 软连接 ln -s 源文件 目标文件   :相当于创建了一个快捷方式,源文件损坏后这个链接也就失效了 ln -s  a.text  a.text.s ...

  3. 硬件中断--DEBUG系列

    问题描述: 在线调试时,全速运行,程序进入硬件中断,查看堆栈窗口,发现是从A函数进去的.但是A函数应该没有问题的: 再次重复,发现是从B函数进去的,但是B函数之前运行起来也没有问题的,而且没有传入参数 ...

  4. Java语言基础---转义符

    转义符 转义符使用“\”表示.常用转义符如下: 1.‘\n’回车 2.‘\t’制表位字符,一个表示向右跳8-10个字符 3.‘\\’表示’\’ 4.‘\’’表示单引号 5.‘\’’’表示双引号 6.‘ ...

  5. global js库

    var GLOBAL = {}; GLOBAL.namespace = function(str) { var arr = str.split("."), o = GLOBAL,i ...

  6. C++文件操作(转)

    C++文件操作(转) 第一个:简单,容易理解,常用:http://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html 第二个:详细的,如 ...

  7. Python面试题之一:解密

    Python面试题之一: 说明:就是Python工程师面试题 一.字典转换与正则提取值 1:key与Value交换 a = {'a':1,'b':2} print({value:key for key ...

  8. Oracle 遇到的问题:IMP-00041: 警告: 创建的对象带有编译警告解决办法

    出现IMP-00041: 警告: 创建的对象带有编译警告:以后再做数据迁移的时候需要额外注意,尤其用户中有视图或者触发器对象的时候.用户的环境是这样的,在库里有三个oracle的用户,其中一个用户中有 ...

  9. msql 数据库介绍和启动

    什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但 ...

  10. Python 第一周编程作业

    一.  编程题 1.  结合turtle库使用手册,读懂下列代码,并在jupyter编译器中运行观察结果: 依次分析下代码: 第一行 通过保留字import引用了Python中用于绘制图形的turtl ...