【BZOJ2245】[SDOI2011]工作安排 拆边费用流
【BZOJ2245】[SDOI2011]工作安排
Description
你的公司接到了一批订单。订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件。公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别。一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造。
我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品。矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0表示员工i不能制造产品j。
如果公司分配了过多工作给一名员工,这名员工会变得不高兴。我们用愤怒值来描述某名员工的心情状态。愤怒值越高,表示这名员工心情越不爽,愤怒值越低,表示这名员工心情越愉快。员工的愤怒值与他被安排制造的产品数量存在某函数关系,鉴于员工们的承受能力不同,不同员工之间的函数关系也是有所区别的。
对于员工i,他的愤怒值与产品数量之间的函数是一个Si+1段的分段函数。当他制造第1~Ti,1件产品时,每件产品会使他的愤怒值增加Wi,1,当他制造第Ti,1+1~Ti,2件产品时,每件产品会使他的愤怒值增加Wi,2……为描述方便,设Ti,0=0,Ti,si+1=+∞,那么当他制造第Ti,j-1+1~Ti,j件产品时,每件产品会使他的愤怒值增加Wi,j, 1≤j≤Si+1。
你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小。由于我们并不想使用Special Judge,也为了使选手有更多的时间研究其他两道题目,你只需要输出最小的愤怒值之和就可以了。
Input
第一行包含两个正整数m和n,分别表示员工数量和产品的种类数;
第二行包含n 个正整数,第i个正整数为Ci;
以下m行每行n 个整数描述矩阵A;
下面m个部分,第i部分描述员工i的愤怒值与产品数量的函数关系。每一部分由三行组成:第一行为一个非负整数Si,第二行包含Si个正整数,其中第j个正整数为Ti,j,如果Si=0那么输入将不会留空行(即这一部分只由两行组成)。第三行包含Si+1个正整数,其中第j个正整数为Wi,j。
Output
仅输出一个整数,表示最小的愤怒值之和。
Sample Input
2 2 2
1 1 0
0 0 1
1
2
1 10
1
2
1 6
Sample Output
HINT
题解:如题,直接连边费用流即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
int n,m,cnt,S,T;
int to[1000000],next[1000000],flow[1000000];
int head[600],t[600],inq[600],pe[600],pv[600];
ll ans,cost[1000000],dis[600];
queue<int> q;
inline int rd()
{int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
void add(int a,int b,ll c,int d)
{to[cnt]=b,cost[cnt]=c,flow[cnt]=d,next[cnt]=head[a],head[a]=cnt++;to[cnt]=a,cost[cnt]=-c,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int bfs()
{memset(dis,0x3f,sizeof(dis));int i,u;q.push(S),dis[S]=0;while(!q.empty()){u=q.front(),q.pop(),inq[u]=0;for(i=head[u];i!=-1;i=next[i]){if(dis[to[i]]>dis[u]+cost[i]&&flow[i]){dis[to[i]]=dis[u]+cost[i],pe[to[i]]=i,pv[to[i]]=u;if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);}}}return dis[T]<0x3f3f3f3f3f3f3f3fll;
}
int main()
{m=rd(),n=rd();int i,j,a,mf;S=0,T=n+m+1;memset(head,-1,sizeof(head));for(i=1;i<=n;i++) add(i+m,T,0,rd());for(i=1;i<=m;i++) for(j=1;j<=n;j++) if(rd()) add(i,j+m,0,1<<30);for(i=1;i<=m;i++){a=rd();for(j=1;j<=a;j++) t[j]=rd();for(j=1;j<=a;j++) add(S,i,rd(),t[j]-t[j-1]);add(S,i,rd(),1<<30);}while(bfs()){mf=1<<30;for(i=T;i!=S;i=pv[i]) mf=min(mf,flow[pe[i]]);ans+=dis[T]*mf;for(i=T;i!=S;i=pv[i]) flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;}printf("%lld",ans);return 0;
}
转载于:https://www.cnblogs.com/CQzhangyu/p/7392050.html
【BZOJ2245】[SDOI2011]工作安排 拆边费用流相关推荐
- BZOJ2245: [SDOI2011]工作安排
题目链接 [分析] 先吐槽:题目读的真的烦..刚开始理解错了题意算出来答案怎么都不对还不知道哪里错了..中午回家才想出来..真的是勺的掺. 其实这个题还是很裸的费用流..看懂题就好. [建图] S向每 ...
- bzoj2245 [SDOI2011]工作安排 费用流
注意这里的分段函数只和个数有关,与种类无关, 然后直接建图,注意开long long 码: #include<iostream> #include<cstdio> #inclu ...
- bzoj2245 [SDOI2011]工作安排
(http://www.elijahqi.win/2017/12/11/bzoj2245-sdoi2011%E5%B7%A5%E4%BD%9C%E5%AE%89%E6%8E%92/%20%E2%80% ...
- 【bzoj2245】[SDOI2011]工作安排 费用流
题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...
- [SDOI2011]工作安排 BZOJ2245
分析: 费用流裸题,按照题面要求建边就可以了,语文题,我读了10多分钟才知道这题干啥...特别是注意一个细节a[j+1]-a[j]... 附上代码: #include <cstdio> # ...
- bzoj 2245 [SDOI2011]工作安排【最小费用最大流】
其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i ...
- bzoj 2245(费用流)
2245: [SDOI2011]工作安排 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1442 Solved: 689 [Submit][Sta ...
- 【bzoj3442】学习小组 费用流
原文地址:http://www.cnblogs.com/GXZlegend/p/6809670.html 题目描述 [背景] 坑校准备鼓励学生参加学习小组. [描述] 共有n个学生,m个学习小组,每个 ...
- [费用流专题]Going Home,Minimum Cost,工作安排
文章目录 T1:Going Home 题目 题解 CODE T2:Minimum Cost 题目 题解 CODE T3:工作安排 题解 CODE T1:Going Home 题目 On a grid ...
最新文章
- c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)
- @transaction 提交事务_Kafka 事务实现原理
- oracle 回收undo,oracle 释放undo空间
- parcelable 缺点_成都金牛区茶道炭优缺点-兴木华木炭
- cordova报错:Could not find an installed version of Gradle either in Android Studio, or on your system
- 前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!
- python代码200行左右_200行Python代码实现2048
- ajax主要有哪些方法,ajax的使用方法和原理,ajax包括哪些技术呢
- mysql主从应用_MySQL主从复制应用、主从复制原理
- 使用PowerDesigner进行面向对象分析与UML建模(转)
- BAT54C那些事儿
- 手把手教你DosBox的配置(附下载资源)
- 飞思卡尔单片机高效c语言编程,飞思卡尔单片机高效C语言编程(中文)
- 适配各种Windows分辨率,为DPI添加感知,当在高DPI时,禁用WINFORM缩放等。
- 浅谈全国统一规范普通高等学校学费标准问题
- RSSHub让万物皆可RSS
- PLM与ERP的区别
- 解决微信扫码下载的两个方法
- 27岁计算机考研,男生27岁研究生毕业真的晚吗?
- VB中操作Excel文档
热门文章
- daily scrum 12.1
- asp.net网页出现名称以无效字符开头的解决方法
- oracle收集统计计划,oracle收集统计信息之analyze
- python变量词是什么意思_python1变量,表达式和语句
- c语言位段sizeof,C语言位段的介绍
- python创建excel图表_python使用VBA(8):Excel创建图表(简单)
- android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定
- es存在某个字段的查阅_ElasticSearch系列02:ES基础概念详解
- spark数据查询语句select_sparksql语句
- php把中文写入mysql_PHP向mysql插入中文乱码问题,php文件内容写入数据库!