BZOJ 1221 软件开发(费用流)
容易看出这是显然的费用流模型。
把每天需要的餐巾数作为限制。需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾。所以加边 (s,x',INF,0),(x'',t,INF,0).
餐巾可以新买。所以需要加边(s,x'',INF,f)。
没用完餐巾可以留到下一天,所以加边(x',x+1',INF,0).
送往快洗店,加边(x',x+a+1'',INF,fa). 送往慢洗店,加边(x',x+b+1'',INF,fb).
跑一遍费用流即可。由于该图是一种特殊的结构,类二分图结构。用ZKW费用流可以快速出解。
- # include <cstdio>
- # include <cstring>
- # include <cstdlib>
- # include <iostream>
- # include <vector>
- # include <queue>
- # include <stack>
- # include <map>
- # include <set>
- # include <cmath>
- # include <algorithm>
- using namespace std;
- # define lowbit(x) ((x)&(-x))
- # define pi 3.1415926535
- # define eps 1e-
- # define MOD
- # define INF
- # define mem(a,b) memset(a,b,sizeof(a))
- # define FOR(i,a,n) for(int i=a; i<=n; ++i)
- # define FO(i,a,n) for(int i=a; i<n; ++i)
- # define bug puts("H");
- # define lch p<<,l,mid
- # define rch p<<|,mid+,r
- # define mp make_pair
- # define pb push_back
- typedef pair<int,int> PII;
- typedef vector<int> VI;
- # pragma comment(linker, "/STACK:1024000000,1024000000")
- typedef long long LL;
- int Scan() {
- int res=, flag=;
- char ch;
- if((ch=getchar())=='-') flag=;
- else if(ch>=''&&ch<='') res=ch-'';
- while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
- return flag?-res:res;
- }
- void Out(int a) {
- if(a<) {putchar('-'); a=-a;}
- if(a>=) Out(a/);
- putchar(a%+'');
- }
- const int N=;
- //Code begin...
- struct Edge{
- int to, next, cap, flow, cost;
- Edge(int _to=, int _next=, int _cap=, int _flow=, int _cost=):
- to(_to), next(_next), cap(_cap), flow(_flow), cost(_cost){}
- }edge[];
- struct ZKW_MinCostMaxFlow{
- int head[], tot, cur[], dis[], ss, tt, n, min_cost, max_flow;
- bool vis[];
- void init(){tot=; mem(head,-);}
- void addedge(int u, int v, int cap, int cost){
- edge[tot]=Edge(v,head[u],cap,,cost);
- head[u]=tot++;
- edge[tot]=Edge(u,head[v],,,-cost);
- head[v]=tot++;
- }
- int aug(int u, int flow){
- if (u==tt) return flow;
- vis[u]=true;
- for (int i=cur[u]; i!=-; i=edge[i].next) {
- int v=edge[i].to;
- if (edge[i].cap>edge[i].flow&&!vis[v]&&dis[u]==dis[v]+edge[i].cost) {
- int tmp=aug(v,min(flow,edge[i].cap-edge[i].flow));
- edge[i].flow+=tmp; edge[i^].flow-=tmp; cur[u]=i;
- if (tmp) return tmp;
- }
- }
- return ;
- }
- bool modify_label(){
- int d=INF;
- FO(u,,n) if (vis[u]) for (int i=head[u]; i!=-; i=edge[i].next) {
- int v=edge[i].to;
- if (edge[i].cap>edge[i].flow&&!vis[v]) d=min(d,dis[v]+edge[i].cost-dis[u]);
- }
- if (d==INF) return false;
- FO(i,,n) if (vis[i]) vis[i]=false, dis[i]+=d;
- return true;
- }
- PII mincostmaxflow(int start, int end, int nn){
- ss=start, tt=end, n=nn; min_cost=max_flow=;
- FO(i,,n) dis[i]=;
- while () {
- FO(i,,n) cur[i]=head[i];
- while () {
- FO(i,,n) vis[i]=false;
- int tmp=aug(ss,INF);
- if (tmp==) break;
- max_flow+=tmp; min_cost+=tmp*dis[ss];
- }
- if (!modify_label()) break;
- }
- return mp(min_cost,max_flow);
- }
- }solve;
- int val[N];
- int main ()
- {
- int n,a,b,fa,fb,f;
- scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb);
- solve.init();
- FOR(i,,n) scanf("%d",val+i), solve.addedge(,i,val[i],), solve.addedge(,i+n,INF,f), solve.addedge(i+n,*n+,val[i],);
- FOR(i,,n) {
- if (i<n) solve.addedge(i,i+,INF,);
- if (i<n-a) solve.addedge(i,i+n+a+,INF,fa);
- if (i<n-b) solve.addedge(i,i+n+b+,INF,fb);
- }
- printf("%d\n",solve.mincostmaxflow(,*n+,*n+).first);
- return ;
- }
BZOJ 1221 软件开发(费用流)的更多相关文章
- bzoj 1221 [HNOI2001] 软件开发 费用流
[HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1938 Solved: 1118[Submit][Status][D ...
- BZOJ 1221 [HNOI2001] 软件开发 费用流_建模
题目描述: 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供 ...
- bzoj1221软件开发 费用流
题目传送门 思路: 网络流拆点有的是“过程拆点”,有的是“状态拆点”,这道题应该就属于状态拆点. 每个点分需要用的,用完的. 对于需要用的,这些毛巾来自新买的和用过的毛巾进行消毒的,流向终点. 对于用 ...
- 【BZOJ1221】【HNOI2001】软件开发 [费用流]
软件开发 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 某软件公司正在规划一项n天的软件开 ...
- 【bzoj1221】[HNOI2001] 软件开发 费用流
题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...
- BZOJ1221 [HNOI2001]软件开发 - 费用流
题解 非常显然的费用流. 但是建图还是需要思考的QuQ 将每天分成两个节点 $x_{i,1}, x_{i,2} $, $ x_{i,1}$用于提供服务, $x_{i ,2}$ 用来从源点获得$nd[i ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
随机推荐
- BZOJ1066_蜥蜴_KEY
题目传送门 经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了. 由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量. 建图: 1.建超级源和超级汇,设超级源连到每只蜥 ...
- VINS(三)IMU预积分
IMU的数据频率一般远高于视觉,在视觉两帧k,k+1之间通常会有>10组IMU数据.IMU的数据通过积分,可以获取当前位姿(p位置,q四元数表达的姿态).瞬时速度等参数. 在VIO中,如果参考世 ...
- SpringBoot-03:SpringBoot+Idea热部署
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 所谓热部署,就是在项目启动中,修改class类中做的修改操作,无需重新启动项目,就可以变更,在网页展示中有 ...
- Spring学习记录-Java 11运行eureka-server报javax.xml.bind.JAXBContext not present错
在pom.xml加入依赖就行 <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId&g ...
- 02-JVM内存模型:虚拟机栈与本地方法栈
一.虚拟机栈(VM Stack) 1.1)什么是虚拟机栈 虚拟机栈是用于描述java方法执行的内存模型. 每个java方法在执行时,会创建一个“栈帧(stack frame)”,栈帧的结构分为“局部变 ...
- 【springboot-01】整合quartz
1.什么是quartz? quartz是一个开源的定时任务框架,具备将定时任务持久化至数据库以及分布式环境下多节点调度的能力.当当的elastic-job便是以quartz为基础,结合zookeepe ...
- hdu2037今年暑假不AC(贪心,活动安排问题)
今年暑假不AC Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- Unity - Humanoid设置Bip骨骼导入报错
报错如下: 解决: 原因是biped骨骼必须按照Unity humanoid的要求设置,在max中设置如下:
- (Python爬虫02) 制定爬虫的学习计划了
公司清退是件很让人郁闷的事情,精,气,神 都会受到影响.焦虑的心态,涣散的眼神, 无所适从的若无其事,人周茶凉的快速交接,各种担忧....平静的面孔波涛汹涌的心.... 认识聊天中满满的套路...还有 ...
- 解决jQuery不同版同时引用的冲突
今天研发的同事在开发一个新jQuery插件时,遇到一个揪心的问题.平台以前使用的 jQuery版本是1.2.6,偶,天啊!这是古代的版本啊! 由于很多功能基于老版本,不能删除啊,同志们都懂的! 于是我 ...