【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 3
2 2 2
1 1 0
0 0 1
1
2
1 10
1
2
1 6

Sample Output

24

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]工作安排 拆边费用流相关推荐

  1. BZOJ2245: [SDOI2011]工作安排

    题目链接 [分析] 先吐槽:题目读的真的烦..刚开始理解错了题意算出来答案怎么都不对还不知道哪里错了..中午回家才想出来..真的是勺的掺. 其实这个题还是很裸的费用流..看懂题就好. [建图] S向每 ...

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

    注意这里的分段函数只和个数有关,与种类无关, 然后直接建图,注意开long long 码: #include<iostream> #include<cstdio> #inclu ...

  3. 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% ...

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

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

  5. [SDOI2011]工作安排 BZOJ2245

    分析: 费用流裸题,按照题面要求建边就可以了,语文题,我读了10多分钟才知道这题干啥...特别是注意一个细节a[j+1]-a[j]... 附上代码: #include <cstdio> # ...

  6. bzoj 2245 [SDOI2011]工作安排【最小费用最大流】

    其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i ...

  7. bzoj 2245(费用流)

    2245: [SDOI2011]工作安排 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1442  Solved: 689 [Submit][Sta ...

  8. 【bzoj3442】学习小组 费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6809670.html 题目描述 [背景] 坑校准备鼓励学生参加学习小组. [描述] 共有n个学生,m个学习小组,每个 ...

  9. [费用流专题]Going Home,Minimum Cost,工作安排

    文章目录 T1:Going Home 题目 题解 CODE T2:Minimum Cost 题目 题解 CODE T3:工作安排 题解 CODE T1:Going Home 题目 On a grid ...

最新文章

  1. c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)
  2. @transaction 提交事务_Kafka 事务实现原理
  3. oracle 回收undo,oracle 释放undo空间
  4. parcelable 缺点_成都金牛区茶道炭优缺点-兴木华木炭
  5. cordova报错:Could not find an installed version of Gradle either in Android Studio, or on your system
  6. 前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!
  7. python代码200行左右_200行Python代码实现2048
  8. ajax主要有哪些方法,ajax的使用方法和原理,ajax包括哪些技术呢
  9. mysql主从应用_MySQL主从复制应用、主从复制原理
  10. 使用PowerDesigner进行面向对象分析与UML建模(转)
  11. BAT54C那些事儿
  12. 手把手教你DosBox的配置(附下载资源)
  13. 飞思卡尔单片机高效c语言编程,飞思卡尔单片机高效C语言编程(中文)
  14. 适配各种Windows分辨率,为DPI添加感知,当在高DPI时,禁用WINFORM缩放等。
  15. 浅谈全国统一规范普通高等学校学费标准问题
  16. RSSHub让万物皆可RSS
  17. PLM与ERP的区别
  18. 解决微信扫码下载的两个方法
  19. 27岁计算机考研,男生27岁研究生毕业真的晚吗?
  20. VB中操作Excel文档

热门文章

  1. daily scrum 12.1
  2. asp.net网页出现名称以无效字符开头的解决方法
  3. oracle收集统计计划,oracle收集统计信息之analyze
  4. python变量词是什么意思_python1变量,表达式和语句
  5. c语言位段sizeof,C语言位段的介绍
  6. python创建excel图表_python使用VBA(8):Excel创建图表(简单)
  7. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定
  8. es存在某个字段的查阅_ElasticSearch系列02:ES基础概念详解
  9. spark数据查询语句select_sparksql语句
  10. php把中文写入mysql_PHP向mysql插入中文乱码问题,php文件内容写入数据库!