2127: happiness

Time Limit: 51 Sec  Memory Limit: 259 MB
Submit: 1815  Solved: 878
[Submit][Status][Discuss]

Description

高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。

Input

第一行两个正整数n,m。接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值。第二个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择理科获得的喜悦值。第三个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择文科获得的额外喜悦值。第四个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择理科获得的额外喜悦值。第五个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择文科获得的额外喜悦值。第六个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择理科获得的额外喜悦值。

Output

输出一个整数,表示喜悦值总和的最大值

Sample Input

1 2
1 1
100 110
1
1000

Sample Output

1210
【样例说明】
两人都选理,则获得100+110+1000的喜悦值。
【数据规模】
对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数

本题和上一题很相似,可以用相同的做法
但是本题可以优化
相邻两个人具有经典的棋盘黑白染色的特征,虽然本题貌似与二分图无关,这是句废话
能不能在一人一点的基础上直接处理出神秘加成
放弃文同时也是放弃了 神秘加成_文/2
两个人都放弃文就成功的放弃了整个 神秘加成_文
理同理
但是一人选文一人选理两个神秘加成都不能要啊,但这样每个神秘加成只放弃了1/2
那就再加两条边,链接相邻两个人,容量为(神秘加成_文+神秘加成_理)/2,割的时候一文一理时必定割去这条两条边之一
 
提示:
那两条边可以直接加无向边
注意:
煞笔Candy?数组开成[10005][10005] bzoj不是T就是M
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const int N=1e4+,M=1e5+,INF=1e9;
  8. inline int read(){
  9. char c=getchar();int x=,f=;
  10. while(c<''||c>''){if(c=='-')f=-; c=getchar();}
  11. while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
  12. return x*f;
  13. }
  14.  
  15. int n,m,num,s,t,a[][],b[][],c,f[][],g[][],sum;
  16. struct edge{
  17. int v,c,f,ne;
  18. }e[M<<];
  19. int cnt,h[N];
  20. inline void ins(int u,int v,int c){
  21. cnt++;
  22. e[cnt].v=v;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[u];h[u]=cnt;
  23. cnt++;
  24. e[cnt].v=u;e[cnt].c=;e[cnt].f=;e[cnt].ne=h[v];h[v]=cnt;
  25. }
  26. inline void ins2(int u,int v,int c){
  27. cnt++;
  28. e[cnt].v=v;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[u];h[u]=cnt;
  29. cnt++;
  30. e[cnt].v=u;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[v];h[v]=cnt;
  31. }
  32. int q[N],head,tail,vis[N],d[N];
  33. bool bfs(){
  34. memset(vis,,sizeof(vis));
  35. memset(d,,sizeof(d));
  36. head=tail=;
  37. d[s]=;vis[s]=;
  38. q[tail++]=s;
  39. while(head!=tail){
  40. int u=q[head++];
  41. for(int i=h[u];i;i=e[i].ne){
  42. int v=e[i].v;
  43. if(!vis[v]&&e[i].c>e[i].f){
  44. vis[v]=;
  45. d[v]=d[u]+;
  46. q[tail++]=v;
  47. if(v==t) return true;
  48. }
  49. }
  50. }
  51. return false;
  52. }
  53. int cur[N];
  54. int dfs(int u,int a){
  55. if(u==t||a==) return a;
  56. int flow=,f;
  57. for(int &i=cur[u];i;i=e[i].ne){
  58. int v=e[i].v;
  59. if(d[v]==d[u]+&&(f=dfs(v,min(a,e[i].c-e[i].f)))>){
  60. flow+=f;
  61. e[i].f+=f;
  62. e[((i-)^)+].f-=f;
  63. a-=f;
  64. if(a==) break;
  65. }
  66. }
  67. return flow;
  68. }
  69. int dinic(){
  70. int flow=;
  71. while(bfs()){
  72. for(int i=s;i<=t;i++) cur[i]=h[i];
  73. flow+=dfs(s,INF);
  74. }
  75. return flow;
  76. }
  77. inline int id(int i,int j){return (i-)*m+j;}
  78. int main(){
  79. //freopen("in.txt","r",stdin);
  80. n=read();m=read();
  81. s=;t=n*m+;
  82. for(int i=;i<=n;i++) for(int j=;j<=m;j++) a[i][j]=read()<<,sum+=a[i][j]>>;
  83. for(int i=;i<=n;i++) for(int j=;j<=m;j++) b[i][j]=read()<<,sum+=b[i][j]>>;
  84. for(int i=;i<=n-;i++) for(int j=;j<=m;j++){
  85. c=read();a[i][j]+=c;a[i+][j]+=c;sum+=c;
  86. f[i][j]+=c;
  87. //ins2(id(i,j),id(i+1,j),c);
  88. }
  89. for(int i=;i<=n-;i++) for(int j=;j<=m;j++){
  90. c=read();b[i][j]+=c;b[i+][j]+=c;sum+=c;
  91. f[i][j]+=c;
  92. //ins2(id(i,j),id(i+1,j),c);
  93. }
  94. for(int i=;i<=n;i++) for(int j=;j<=m-;j++){
  95. c=read();a[i][j]+=c;a[i][j+]+=c;sum+=c;
  96. g[i][j]+=c;
  97. //ins2(id(i,j),id(i,j+1),c);
  98. }
  99. for(int i=;i<=n;i++) for(int j=;j<=m-;j++){
  100. c=read();b[i][j]+=c;b[i][j+]+=c;sum+=c;
  101. g[i][j]+=c;
  102. //ins2(id(i,j),id(i,j+1),c);
  103. }
  104. for(int i=;i<=n;i++) for(int j=;j<=m;j++){
  105. ins(s,id(i,j),a[i][j]);
  106. ins(id(i,j),t,b[i][j]);
  107. ins2(id(i,j),id(i+,j),f[i][j]);
  108. ins2(id(i,j),id(i,j+),g[i][j]);
  109. }
  110. int ans=dinic();
  111. printf("%d",sum-(ans>>));
  112. }
 
 
 

BZOJ 2127: happiness [最小割]的更多相关文章

  1. [置顶] [BZOJ]2127: happiness 最小割

    happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...

  2. BZOJ 2127: happiness(最小割解决集合划分)

    Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2350  Solved: 1138[Submit][Status][Discuss] Descript ...

  3. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  4. BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)

    题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...

  5. [国家集训队]happiness 最小割 BZOJ 2127

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  6. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

  7. [bzoj2127]happiness——最小割

    这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...

  8. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  9. bzoj 2127: happiness

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

随机推荐

  1. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  2. 阿里云直播 C# SDK 如何使用

    阿里云直播SDK的坑 1.直播云没有单独的SDK,直播部分被封装在CDN的相关SDK当中. 2.针对SDK,没有相关Demo. 3.针对SDK,没有相关的文档说明. 4.针对SDK的说明,官网上的说明 ...

  3. CSS十问——好奇心+刨根问底=CSSer

    最近有时间,想把酝酿的几篇博客都写出来,今天前端小学生带着10个问题,跟大家分享一下学习CSS的一些体会,我觉得想学好CSS,必须保持一颗好奇心和刨根问底的劲头,而不是复制粘贴,得过且过.本人能力有限 ...

  4. Android 剪贴板详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...

  5. sql的那些事(一)

    一.概述 书写sql是我们程序猿在开发中必不可少的技能,优秀的sql语句,执行起来吊炸天,性能杠杠的.差劲的sql,不仅使查询效率降低,维护起来也十分不便.一切都是为了性能,一切都是为了业务,你觉得你 ...

  6. 高仿it之家新闻客户端源码

    仿it之家新闻客户端界面,数据为本地假数据.仅实现了新闻模块的功能. 源码下载:http://code.662p.com/list/11_1.html 详细说明:http://android.662p ...

  7. i++、++i 、i--、--i

    总结: i++ 先用后加, ++i先加后用: i--先用后减, --i先减后用: //int i = 1; //Console.WriteLine(i);//1 //Console.WriteLine ...

  8. 2003-Can't connect to mysql server on localhost (10061)

    mysql数据库出现2003-Can't connect to mysql server on localhost (10061)问题 解决办法:查看wampserver服务器是否启动,如果没有启动启 ...

  9. Linux网卡驱动安装、防火墙原理

    安装网卡驱动程序: 需要检查是否安装kernel依赖包: rpm –q kernel-devel #检查kernel依赖包是否安装 yum –y install kernel-devel 检查gcc和 ...

  10. 烂泥:VMWare Workation双网卡配置IP地址

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前几天给一个客户做远程项目实施,客户那边的服务器是Windows OS的,我们这边的业务 ...