BZOJ-1221 软件开发
这题是基于一道经典的费用流模型。
将每天拆成两个点i和j,新增源和汇并建立六种边:
1.从源出发到每个i点,flow为+∞,cost为每条新餐巾的价值,表示这一天所使用的餐巾中来自购买的餐巾
2.从源出发到每个j点,flow为每天所需的餐巾数,cost为0,表示这一天最多可使用的餐巾
3.从每个i点出发至汇,flow为每天所需的餐巾数,cost为0,表示这一天应该使用的餐巾
4.从每个j点出发至下一个j点,flow为+∞,cost为0,表示这一天使用后的餐巾移至下一天
5.从每个j点出发至下a个i点,flow为+∞,cost为第一种消毒的费用,表示这一天所使用的餐巾中来自第一种消毒后的餐巾
6.从每个j点出发至下b个i点,flow为+∞,cost为第二种消毒的费用,表示这一天所使用的餐巾中来自第二种消毒后的餐巾
然后最小费用最大流跑之。
基于图的稀疏,我用ZKW费用流实现。
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <deque>
using namespace std;
typedef long long ll;
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(c))
#define travel(x) for(edge *p=fir[x]; p; p=p->n) if (p->f)
#define pb push_back
#define pf push_front
#define maxv 2009
#define maxm 30009
#define inf 0x7fffffff
int read()
{
int x=0; char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x;
} struct edge{int y, f, c; edge *n, *pair;} e[maxm], *fir[maxv], *pt;
inline void Init(){pt=e; clr(fir, 0);}
inline void Add(int x, int y, int f, int c)
{pt->y=y, pt->f=f, pt->c=c, pt->n=fir[x]; fir[x]=pt++;}
inline void AddE(int x, int y, int f, int c)
{Add(x, y, f, c); Add(y, x, 0, -c); fir[x]->pair=fir[y], fir[y]->pair=fir[x];}
int S, T, V, d[maxv]; ll cost=0;
int dist[maxv], st[maxv];
bool b[maxv];
deque <int> q;
inline void spfa()
{
rep(i, 1, V) d[i]=inf, b[i]=0; q.clear();
q.pb(S), d[S]=0, b[S]=1;
while (!q.empty())
{
int x=q.front(), y; q.pop_front(); b[x]=0;
travel(x) if (d[y=p->y] > d[x]+p->c)
{
d[y]=d[x]+p->c;
if (!b[y]) b[y]=1, (!q.empty() && d[q.front()]>d[y]) ? q.pf(y) : q.pb(y);
}
}
}
void dfs(int now)
{
b[now]=1; int y;
travel(now)
if (d[now]+p->c==d[y=p->y] && !b[y])
dist[y]=dist[now]-p->c, dfs(y);
}
int aug(int now, int flow)
{
if (now==T) {cost+=flow*(dist[S]-dist[T]); return flow;}
b[now]=1; int rec=0, y, ret;
travel(now) if (!b[y=p->y])
{
if (dist[now]==dist[y]+p->c)
{
ret=aug(y, min(flow-rec, p->f));
p->f-=ret, p->pair->f+=ret;
if ((rec+=ret)==flow) return flow;
}
else st[y]=min(st[y], dist[y]+p->c-dist[now]);
}
return rec;
}
inline bool relabel()
{
int a=inf;
rep(i, 1, V) if (!b[i]) a=min(a, st[i]);
if (a==inf) return 0;
rep(i, 1, V) if (b[i]) dist[i]+=a;
return 1;
}
inline void costflow()
{
spfa();
clr(b, 0); clr(dist, 0);
dfs(S);
while(1)
{
rep(i, 1, V) st[i]=inf;
while(1)
{
rep(i, 1, V) b[i]=0;//clr(b, 0);
if (!aug(S, inf)) break;
}
if (!relabel()) break;
}
} int n;
int main(){
Init(); n=read(); S=n*2+1; T=V=n*2+2;
int a=read(), b=read(), f=read(), fa=read(), fb=read();
rep(i, 1, n-a) AddE(i*2, (i+a+1)*2-1, inf, fa);
rep(i, 1, n-b) AddE(i*2, (i+b+1)*2-1, inf, fb);
rep(i, 1, n) a=read(), AddE(S, i*2-1, inf, f), AddE(S, i*2, a, 0), AddE(i*2-1, T, a, 0);
rep(i, 1, n-1) AddE(i*2, i*2+2, inf, 0);
costflow(); printf("%lld\n", cost);
return 0;
}
BZOJ-1221 软件开发的更多相关文章
- BZOJ 1221 软件开发(费用流)
容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...
- 【BZOJ】【1221】【HNOI2001】软件开发
网络流/费用流 说是这题跟餐巾计划一模一样……但我没做过啊……so sad 二分图建模是很好想的,但是要控制流量跟用了的毛巾一样多……oh my god 事实上对于每一天我们无论如何都是要消耗n[i] ...
- BZOJ 1221: [HNOI2001] 软件开发
1221: [HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1428 Solved: 791[Submit][Stat ...
- 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...
- BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发
3280: 小R的烦恼 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 399 Solved: 200[Submit][Status][Discuss ...
- BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)
不知道为什么这么慢.... 费用流,拆点.... --------------------------------------------------------------------------- ...
- 【BZOJ 1221】 1221: [HNOI2001] 软件开发 (最小费用流)
1221: [HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1581 Solved: 891 Description ...
- [BZOJ 1221] [HNOI2001] 软件开发 【费用流 || 三分】
题目链接:BZOJ - 1221 题目分析 算法一:最小费用最大流 首先这是一道经典的网络流问题.每天建立两个节点,一个 i 表示使用毛巾,一个 i' 表示这天用过的毛巾. 然后 i 向 T 连 Ai ...
- bzoj:1221;vijos 1552 软件开发
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- bzoj 1221 [HNOI2001] 软件开发 费用流
[HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1938 Solved: 1118[Submit][Status][D ...
随机推荐
- 《队长说得队》第九次团队作业:Beta冲刺与验收准备
项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十三 团队作业9:Beta冲刺与团队项目验收 团队名 ...
- JavaScript——图片懒加载
前言 有一个朋友问我这个问题,刚好有时间,现在就简单的写个Demo~ github | https://github.com/wangyang0210/bky/tree/picLoadLazy 内容 ...
- iOS项目工程及目录结构
做过一些iOS的项目,不同项目的沉淀没有积累到一起,目录的管理都在后期随着人员的增加越来越混乱,因此在这里做一些梳理,希望达到两个目的. 一套相对通用的目录结构,作为后续项目的模版. 积累相应的基础库 ...
- 配置淘宝镜像,不使用怪异的cnpm
npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm. ...
- stack与heap、new的内存分配、static对象。(effective c++ 04)
阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下. 目录 sta ...
- 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸
dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...
- Java使用ResourceBundle类读取properties文件中文乱码的解决方案
Java使用java.util.ResourceBundle类的方式来读取properties文件时不支持中文,要想支持中文必须将文件设置为ISO-8859-1编码格式,这对于开发工具默认为UTF-8 ...
- 大意了,这几道Python面试题没有答对,Python面试题No13
第1题: Python如何爬取 HTTPS 网站? 这类问题属于简单类问题 在使用 requests 前加入:requests.packages.urllib3.disable_warnings(). ...
- 字符串:HDU5371-Hotaru's problem(manacher 的应用)
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pr ...
- re--findall 【转】
原文链接 python re 模块 findall 函数用法简述 代码示例: >>> import re >>> s = "adfad asdfasdf ...