题目描述

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

输入

第一行两个正整数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列的同学同时选择理科获得的额外喜悦值。

输出

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

样例输入

1 2
1 1
100 110
1
1000

样例输出

1210
【样例说明】
两人都选理,则获得100+110+1000的喜悦值。
【数据规模】
对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数
这道题和BZOJ3894类似,同样将每个人与源汇点分别相连,流量为选文/理的收益。对于每个组合收益新建点,并与相关的人连边,流量为$INF$,如果是需要同时选文就与源点连边,反之与汇点连边,流量为对应收益。答案就是总收益$-$最小割。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int head[60000];
int to[300000];
int next[300000];
int val[300000];
int d[60000];
int q[60000];
int back[60000];
int S,T;
int x;
int n,m;
int tot=1;
int ans;
void add(int x,int y,int v)
{tot++;next[tot]=back[x];back[x]=tot;to[tot]=y;val[tot]=v;tot++;next[tot]=back[y];back[y]=tot;to[tot]=x;val[tot]=0;
}
bool bfs(int S,int T)
{int r=0;int l=0;memset(d,-1,sizeof(d));q[r++]=T;d[T]=2;while(l<r){int now=q[l];for(int i=back[now];i;i=next[i]){if(d[to[i]]==-1&&val[i^1]!=0){d[to[i]]=d[now]+1;q[r++]=to[i];}}l++;}if(d[S]==-1){return false;}else{return true;}
}
int dfs(int x,int flow)
{if(x==T){return flow;}int now_flow;int used=0;for(int &i=head[x];i;i=next[i]){if(d[to[i]]==d[x]-1&&val[i]!=0){now_flow=dfs(to[i],min(flow-used,val[i]));val[i]-=now_flow;val[i^1]+=now_flow;used+=now_flow;if(now_flow==flow){return flow;}}}if(used==0){d[x]=-1;}return used;
}
int dinic()
{int res=0;while(bfs(S,T)){memcpy(head,back,sizeof(back));res+=dfs(S,0x3f3f3f3f);}return res;
}
int find(int x,int y)
{return (x-1)*m+y;
}
int main()
{scanf("%d%d",&n,&m);S=n*m*5+1;T=n*m*5+2;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&x);add(S,find(i,j),x);ans+=x;}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&x);add(find(i,j),T,x);ans+=x;}}for(int i=1;i<n;i++){for(int j=1;j<=m;j++){scanf("%d",&x);ans+=x;add(S,n*m+find(i,j),x);add(n*m+find(i,j),find(i,j),INF);add(n*m+find(i,j),find(i+1,j),INF);}}for(int i=1;i<n;i++){for(int j=1;j<=m;j++){scanf("%d",&x);ans+=x;add(2*n*m+find(i,j),T,x);add(find(i,j),2*n*m+find(i,j),INF);add(find(i+1,j),2*n*m+find(i,j),INF);}}for(int i=1;i<=n;i++){for(int j=1;j<m;j++){scanf("%d",&x);ans+=x;add(S,3*n*m+find(i,j),x);add(3*n*m+find(i,j),find(i,j),INF);add(3*n*m+find(i,j),find(i,j+1),INF);}}for(int i=1;i<=n;i++){for(int j=1;j<m;j++){scanf("%d",&x);ans+=x;add(4*n*m+find(i,j),T,x);add(find(i,j),4*n*m+find(i,j),INF);add(find(i,j+1),4*n*m+find(i,j),INF);}}printf("%d",ans-dinic());
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10584330.html

BZOJ2127happiness——最小割相关推荐

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

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

  2. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  3. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  4. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  5. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

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

  6. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  7. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

  8. 最小割 ---- 集合冲突模型

    集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...

  9. BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...

最新文章

  1. 损坏防浪涌电插排内部电路
  2. Silverlight实用窍门系列:65.Silverlight的数据模板DataTemplate(一)使用数据模板
  3. php嵌入html后缀_php中怎么嵌入html代码
  4. 阿里巴巴高级技术专家:不要用沉默的方式一味地迎合别人的要求,据理力争或许才是作为的表现
  5. JavaScript的变量作用域深入理解(转)
  6. Mysql京东的一道面试题目 比较综合
  7. kubernetes1.8.4安装指南 -- 2. ssh免密登录
  8. Eclipse打包出错——提示GC overhead limit exceeded
  9. 发生地震等灾难,死难者的存款会怎么处理?
  10. SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题
  11. angular html清除元素,在Angular js中单击时删除HTML元素
  12. LeetCode MySQL 569. 员工薪水中位数(over窗口函数)
  13. Linux修改root用户登录密码
  14. thoughtworks面试题分析与解答
  15. BytePS源码解析
  16. Xshell官网登陆及软件下载,以及百度网盘免费提速
  17. ArcGIS Pro功能模块简介
  18. iPhone X(10)屏幕分辨率与适配
  19. 2008ESRI用户大会问答之ArcGIS部分
  20. C语言中的float(单精度浮点数)

热门文章

  1. 微服务配置中心是干啥的_配置中心微服务器配置
  2. python 判断列表list是否为空
  3. 【字节流处理】linux下uint8转float的注意事项
  4. IDEA-Java自动生成单元测试
  5. 2010河北职称计算机考试,2010年河北省职称计算机考试试题..doc
  6. redhat 7.3 mysql_RedHat7.3安装MySQL5.7
  7. yum安装nginx
  8. 【java 性能优化实战】2 深入剖析:哪些资源,容易成为瓶颈
  9. Python模拟登录,Python识别图形验证码实现自动登陆
  10. android checkbox状态不刷新,android开发分享更改checkbox的值,而不触发onCheckChanged