【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

题解:如题,直接连边费用流即可。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <queue>
  5. using namespace std;
  6. typedef long long ll;
  7. int n,m,cnt,S,T;
  8. int to[1000000],next[1000000],flow[1000000];
  9. int head[600],t[600],inq[600],pe[600],pv[600];
  10. ll ans,cost[1000000],dis[600];
  11. queue<int> q;
  12. inline int rd()
  13. {
  14. int ret=0,f=1; char gc=getchar();
  15. while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
  16. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  17. return ret*f;
  18. }
  19. void add(int a,int b,ll c,int d)
  20. {
  21. to[cnt]=b,cost[cnt]=c,flow[cnt]=d,next[cnt]=head[a],head[a]=cnt++;
  22. to[cnt]=a,cost[cnt]=-c,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
  23. }
  24. int bfs()
  25. {
  26. memset(dis,0x3f,sizeof(dis));
  27. int i,u;
  28. q.push(S),dis[S]=0;
  29. while(!q.empty())
  30. {
  31. u=q.front(),q.pop(),inq[u]=0;
  32. for(i=head[u];i!=-1;i=next[i])
  33. {
  34. if(dis[to[i]]>dis[u]+cost[i]&&flow[i])
  35. {
  36. dis[to[i]]=dis[u]+cost[i],pe[to[i]]=i,pv[to[i]]=u;
  37. if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
  38. }
  39. }
  40. }
  41. return dis[T]<0x3f3f3f3f3f3f3f3fll;
  42. }
  43. int main()
  44. {
  45. m=rd(),n=rd();
  46. int i,j,a,mf;
  47. S=0,T=n+m+1;
  48. memset(head,-1,sizeof(head));
  49. for(i=1;i<=n;i++) add(i+m,T,0,rd());
  50. for(i=1;i<=m;i++) for(j=1;j<=n;j++) if(rd()) add(i,j+m,0,1<<30);
  51. for(i=1;i<=m;i++)
  52. {
  53. a=rd();
  54. for(j=1;j<=a;j++) t[j]=rd();
  55. for(j=1;j<=a;j++) add(S,i,rd(),t[j]-t[j-1]);
  56. add(S,i,rd(),1<<30);
  57. }
  58. while(bfs())
  59. {
  60. mf=1<<30;
  61. for(i=T;i!=S;i=pv[i]) mf=min(mf,flow[pe[i]]);
  62. ans+=dis[T]*mf;
  63. for(i=T;i!=S;i=pv[i]) flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;
  64. }
  65. printf("%lld",ans);
  66. return 0;
  67. }

【BZOJ2245】[SDOI2011]工作安排 拆边费用流的更多相关文章

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

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

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

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

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

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

  4. bzoj2245: [SDOI2011]工作安排

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

  5. 【Luogu】P2488工作安排(费用流)

    题目链接 这题……费用流即可……(哇啊要被打死辣) 然而我printf("%d")爆零四次 好的心如死灰 #include<cstdio> #include<cs ...

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

    题目大意: 传送门 题解: 很容易建模,把每一个工作人员拆成两个点,由第一个点向第二个点连S+1条边即可. 这水题没什么难度,主要是longlong卡的丧心病狂... 代码 #include < ...

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

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

  8. bzoj 2245 [SDOI2011]工作安排(最小费用最大流)

    2245: [SDOI2011]工作安排 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1197  Solved: 580[Submit][Statu ...

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

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

随机推荐

  1. NOIP 2016 天天爱跑步 80分暴力

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...

  2. Codeforces 482B Interesting Array(线段树区间更新)

    题目链接 Interesting Array 区间更新.然后对于每一个约数重新求一遍区间的&值,不符合就跳出. #include <bits/stdc++.h> using nam ...

  3. 常用的Linux系统命令

    一.linux简介                                                                                            ...

  4. 解决: g++: internal compiler error: Killed (program cc1plus)

    现象描述:在树莓派上用qt编译二维码显示相关的UI程序时,经常报以上错误,有时候断电重启首次编译不会报错(估计是刚上电系统占用的内存比较少) g++: internal compiler error: ...

  5. Java Servlet Filter

    做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...

  6. WinForm版聊天室复习Socket通信

    聊天室:服务器端-------------客户端 最终演示展示图: 一. 服务器端 对服务端为了让主窗体后台不处理具体业务逻辑,因此对服务端进行了封装,专门用来处理某个客户端通信的过程. 而由于通信管 ...

  7. Idea下Maven的使用

    一.导入maven结构的web工程 (1)在Intellij IDEA中选择File->New->Project from Version Control->Subversion. ...

  8. Http头 Range、Content-Range

    HTTP头中一般断点下载时才用到Range和Content-Range实体头,Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300)Content-Rang ...

  9. hibernate多对一单向配置

    查看:http://blog.csdn.net/u010702229/article/details/13170263

  10. ASP.NET Web API路由规则(二) 【转】

    http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html 默认的规则 在ASP.NET MVC4中 global.asax.cs代码中 ...