2127: happiness

Time Limit: 51 Sec  Memory Limit: 259 MB
Submit: 2084  Solved: 1028

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的非负整数
首先我们来吐槽一下

什么狗屁BZOJ,钱收的越来越多,事却办不利索,TLE了一晚上,一次比一次慢,最后一次是STD;

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 10005
#define maxm 550000
#define inf 1061109567
using namespace std;
char ch;
bool ok;
void read(int &x){for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if (ok) x=-x;
}
int n,m,a[105][105],b[105][105],c[105][105],d[105][105],ans;
struct flow{int s,t,tot,now[maxn],son[maxm],pre[maxm],val[maxm];int dis[maxn],head,tail,list[maxn];bool bo[maxn];void init(){s=0,t=n*m+1,tot=1,memset(now,0,sizeof(now));}void put(int a,int b,int c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c;}void add(int a,int b,int c){put(a,b,c),put(b,a,0);}bool bfs(){memset(bo,0,sizeof(bo));head=0,tail=1,list[1]=s,dis[s]=0,bo[s]=1;while (head<tail){int u=list[++head];for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])if (val[p]&&!bo[v]) bo[v]=1,dis[v]=dis[u]+1,list[++tail]=v;}return bo[t];}int dfs(int u,int rest){if (u==t) return rest;int ans=0;for (int p=now[u],v=son[p];p&&rest;p=pre[p],v=son[p])if (val[p]&&dis[v]==dis[u]+1){int d=dfs(v,min(rest,val[p]));val[p]-=d,val[p^1]+=d,ans+=d,rest-=d;}if (!ans) dis[u]=-1;return ans;}int dinic(){int ans=0;while (bfs()) ans+=dfs(s,inf);return ans;}
}f;
inline int calc(int a,int b){return (a-1)*m+b;}
int main(){read(n),read(m),f.init();for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) read(a[i][j]);for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) read(b[i][j]);for (int i=1;i<=n;i++) for (int j=1;j<=m;j++){int u=calc(i,j);f.add(f.s,u,b[i][j]<<1),f.add(u,f.t,a[i][j]<<1);ans+=a[i][j]+b[i][j];}for (int i=1;i<n;i++) for (int j=1;j<=m;j++) read(c[i][j]);for (int i=1;i<n;i++) for (int j=1;j<=m;j++) read(d[i][j]);for (int i=1;i<n;i++) for (int j=1;j<=m;j++){int u=calc(i,j),v=calc(i+1,j);f.add(f.s,u,d[i][j]),f.add(f.s,v,d[i][j]);f.add(u,f.t,c[i][j]),f.add(v,f.t,c[i][j]);f.add(u,v,c[i][j]+d[i][j]),f.add(v,u,c[i][j]+d[i][j]);ans+=c[i][j]+d[i][j];}for (int i=1;i<=n;i++) for (int j=1;j<m;j++) read(c[i][j]);for (int i=1;i<=n;i++) for (int j=1;j<m;j++) read(d[i][j]);for (int i=1;i<=n;i++) for (int j=1;j<m;j++){int u=calc(i,j),v=calc(i,j+1);f.add(f.s,u,d[i][j]),f.add(f.s,v,d[i][j]);f.add(u,f.t,c[i][j]),f.add(v,f.t,c[i][j]);f.add(u,v,c[i][j]+d[i][j]),f.add(v,u,c[i][j]+d[i][j]);ans+=c[i][j]+d[i][j];}printf("%d\n",ans-(f.dinic()>>1));return 0;
}

转载于:https://www.cnblogs.com/suishiguang/p/6827509.html

BZOJ 2127: happiness相关推荐

  1. BZOJ 2127 happiness (最小割)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2127 题解: 这道题就是传说中的"解方程"法.(貌似也有类似于BZ ...

  2. Bzoj 2127 happiness 最小割

    happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) = 文科值 flow(u,t) = 理科值 假设u 和 v 一起选 ...

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

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

  4. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  5. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  6. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  7. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  8. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  9. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

最新文章

  1. 教你如何运用python实现简单文件读写函数
  2. Android中的定时器AlarmManager
  3. genrsa out php,PHP进行RSA加密解密
  4. 服务器安装系统时无法创建新的分区,重装系统出现“我们无法创建新的分区,也找不到现有的分区”...
  5. sudo apt-get update后public key is not available公钥不存在问题解决
  6. Spring Cloud GatewayAPI网关服务
  7. wxWidgets:wxMediaEvent类用法
  8. python做什么方向好_Python工程师的择业方向有哪些?你想好做什么工作了吗?
  9. jsp+servlet+mysql简单实现用户登陆注册
  10. karto探秘之open_karto 第一章 --- 数据结构与类的初始化
  11. 【023】翼辉信息于南京召开国产嵌入式信息产业前沿技术交流会暨SylixOS新版发布会
  12. 【关于听任大佬的讲话的深刻感悟】
  13. 如何为word增加页码,且第一页不显示页码?
  14. python3 + scrapy爬取妹子图(meizitu.com)
  15. POJ2248-Addition Chains-经典搜索题详解优化
  16. Microsoft Word 教程:如何在 Word 中更改页面方向、为页面添加边框?
  17. Excel区间数据拆分
  18. 插入排序基本思路与算法
  19. 网路视屏学习资源共享
  20. 文本数据分析的作用是什么?文本数据分析可采用哪些方法?

热门文章

  1. 清除word中超链接
  2. 玻璃体混浊不要转眼球
  3. 银屑病缺乏的营养汇总(持续更新中)
  4. Could not find a suitable table factory for ‘org.apache.flink.table.factories.TableSourceFactory‘
  5. 常见的14种异常心电图的波形特点
  6. 虛擬機xp中安裝幸福之家3.23
  7. OpenCV学习笔记四-image的一些整体操作
  8. const char* p 、char* const p、const (char*) p 理解记忆
  9. 深度学习(三)——Autoencoder, 词向量
  10. 引用一个项目作为library的操作步骤---开发中遇到的问题(二)