题目大意:
有A、B两个集合和n个物品,每个物品只能放在一个集合里。每个物品放在不同集合内能获得不同价值。
有一些物品,如果它们同时放在一个集合内,则会产生新的价值(A和B中都有且不一定相同(c1和c2))。有若干这样的关系。
现在让你求最大总价值。
解题思路:
最大权闭合子图。
首先拆点,把点i拆成xi和yi
从S向每个xi连容量为“其放在集合A中的价值”的边,从xi向yi连容量为inf的边,从yi向T连容量为“其放在集合B中的价值”的边。
对于每个关系,新建节点p1,p2。从S向p1连容量为c1的边,从p1向每个有关系的y点连容量为inf的边;从p2向T连容量为c2的边,从每个有关系的x点向p2连容量为inf的边。
然后用总价值(包括关系中的c1和c2)减去最小割即可。

C++ Code:

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. #include<queue>
  5. const int S=0,T=40003,inf=0x3fffffff;
  6. inline int readint(){
  7. int c=getchar(),d=0;
  8. for(;!isdigit(c);c=getchar());
  9. for(;isdigit(c);c=getchar())
  10. d=(d<<3)+(d<<1)+(c^'0');
  11. return d;
  12. }
  13. int n,m,head[40333],cnt=1,level[40333],iter[40333],mrsrz,nx[40333];
  14. struct edge{
  15. int to,nxt,cap;
  16. }e[1700005];
  17. inline void addedge(int u,int v,int t){
  18. e[++cnt]=(edge){v,head[u],t};
  19. head[u]=cnt;
  20. e[++cnt]=(edge){u,head[v],0};
  21. head[v]=cnt;
  22. }
  23. std::queue<int>q;
  24. void bfs(){
  25. level[S]=1;
  26. for(q.push(S);!q.empty();){
  27. int u=q.front();
  28. q.pop();
  29. for(int i=head[u];~i;i=e[i].nxt)
  30. if(e[i].cap&&!~level[e[i].to]){
  31. level[e[i].to]=level[u]+1;
  32. q.push(e[i].to);
  33. }
  34. }
  35. }
  36. inline int min(int a,int b){return a<b?a:b;}
  37. int dfs(int u,int f){
  38. if(!f||u==T)return f;
  39. for(int& i=iter[u];~i;i=e[i].nxt)
  40. if(e[i].cap&&level[e[i].to]>level[u]){
  41. int d=dfs(e[i].to,min(f,e[i].cap));
  42. if(d){
  43. e[i].cap-=d;
  44. e[i^1].cap+=d;
  45. return d;
  46. }else level[e[i].to]=-1;
  47. }
  48. return 0;
  49. }
  50. int dinic(){
  51. for(int flow=0,f;;){
  52. memset(level,-1,sizeof nx);
  53. if(bfs(),!~level[T])return flow;
  54. memcpy(iter,head,sizeof nx);
  55. while(f=dfs(S,inf))flow+=f;
  56. }
  57. }
  58. int main(){
  59. #ifdef LOCALJUDGE
  60. freopen("input.txt","r",stdin);
  61. #endif
  62. int ans=0;
  63. memset(head,-1,sizeof head);
  64. n=readint();
  65. for(int i=1;i<=n;++i){
  66. int p=readint();
  67. ans+=p;
  68. addedge(S,i,p);
  69. }
  70. for(int i=1;i<=n;++i)addedge(i,i+n,inf);
  71. for(int i=1;i<=n;++i){
  72. int p=readint();
  73. ans+=p;
  74. addedge(i+n,T,p);
  75. }
  76. mrsrz=n<<1;
  77. for(int k=readint();k--;){
  78. int m=readint(),c1=readint(),c2=readint();
  79. ans+=c1+c2;
  80. for(int i=1;i<=m;++i)nx[i]=readint();
  81. addedge(S,++mrsrz,c1);
  82. for(int i=1;i<=m;++i)addedge(mrsrz,nx[i],inf);
  83. addedge(++mrsrz,T,c2);
  84. for(int i=1;i<=m;++i)addedge(nx[i],mrsrz,inf);
  85. }
  86. printf("%d\n",ans-dinic());
  87. return 0;
  88. }

[BZOJ3438][洛谷P1361]小M的作物的更多相关文章

  1. 洛谷 P1361 小M的作物 解题报告

    P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P\)有\(n\)中作物的种子,每种作物的种子有1个(就是可以种一棵作物) ...

  2. [洛谷P1361]小M的作物

    题目大意:将作物种在A,B两地,对于每种作物,种A,B分别有不同的收益,对于一些特殊的作物集合,共同种到A,B集合分别有一些额外收益.求最大收益. 题解:最小割,S向i连容量为$a_i$的边,i向T连 ...

  3. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  4. 洛谷P1120 小木棍

    洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长 ...

  5. 洛谷1373 小a和uim之大逃离

    洛谷1373 小a和uim之大逃离 本题地址:http://www.luogu.org/problem/show?pid=1373 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北 ...

  6. P1361 小M的作物

    P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...

  7. 洛谷 P4430 小猴打架

    洛谷 P4430 小猴打架 题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打 ...

  8. 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)

    莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...

  9. luogu P1361 小M的作物

    题目链接 luogu P1361 小M的作物 题解 源汇点为A,B 向种子连边,容量为价值,每个种子能与A或B联通,考虑最小割 用建边的总流量减去最小割就是答案 相同利益的时候新建节点,由额外利益构成 ...

随机推荐

  1. CSS - Span 下的width设置不可用?

    解决:Span 下的width设置不可用? 内联元素-span有根据内容自动伸缩的能力,当需要对其宽度设定时,出现无效的情况. Demo:http://jsfiddle.net/JSDavi/ad62 ...

  2. linux github 添加ssh

    1.本地生成key,  xxx 是github 的账号, 执行下面命令一路下一步 ssh-keygen -t rsa -C "xxx" 2.复制下面的public key 到git ...

  3. 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数

    在Web项目中,如果前端MVC框架使用的是SpringMVC,可以使用Map接收前端请求参数,比bean要方便很多. 尤其是SpringMVC和Mybatis一起用的时候,用Map大大减少了需要的be ...

  4. poj 2139 flord水题

    读懂题意就简单了 #include<stdio.h> #define inf 999999999 #define N 310 int f[N]; int map[N][N]; int ma ...

  5. 2014年spark开发人员大赛火热进行中!

    "发现最有正能量的网络达人".Spark开发人员大赛火热进行! watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3d0dHoxOTc0/ ...

  6. Android 自己定义View学习(2)

    上一篇学习了基本使用方法,今天学一下略微复杂一点的.先看一下效果图 为了完毕上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0& ...

  7. [CortexM0--stm32f0308]Low Power Mode

    问题描写叙述 stm32f0308正常是运行在Run mode下.这样的mode是在reset之后的默认模式.Low Power Mode.即低功耗模式.用于在IC空暇时能够考虑选择进入.使系统耗能减 ...

  8. linux下jenkins安装

    在安装jenkins之前.首先确认jdk和tomcat,maven已经配置好 详细配置方法,请看的我博客. jdk:jdk的安装与配置 tomcat:tomcat的安装与配置 maven:maven的 ...

  9. hdu 3177 Crixalis&#39;s Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. Oracle 单表选择率

    听了猫大师的课,对Oracle CBO又加深了一步理解: 单表选择率: selectivity=1/ndv*a4nulls ocard来自dba_tables.num_rows ndv 来自dba_t ...