BZOJ2127happiness——最小割
题目描述
高一一班的座位表是个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 1
100 110
1
1000
样例输出
【样例说明】
两人都选理,则获得100+110+1000的喜悦值。
【数据规模】
对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数
#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——最小割相关推荐
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- [学习笔记]最小割之最小点权覆盖最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】
题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...
- 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))
题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp 的收益,求最大净收益. 解题思路: 树形 ...
- 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness
题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...
- 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)
二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...
- 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]
题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...
- 最小割 ---- 集合冲突模型
集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...
- BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...
最新文章
- 损坏防浪涌电插排内部电路
- Silverlight实用窍门系列:65.Silverlight的数据模板DataTemplate(一)使用数据模板
- php嵌入html后缀_php中怎么嵌入html代码
- 阿里巴巴高级技术专家:不要用沉默的方式一味地迎合别人的要求,据理力争或许才是作为的表现
- JavaScript的变量作用域深入理解(转)
- Mysql京东的一道面试题目 比较综合
- kubernetes1.8.4安装指南 -- 2. ssh免密登录
- Eclipse打包出错——提示GC overhead limit exceeded
- 发生地震等灾难,死难者的存款会怎么处理?
- SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题
- angular html清除元素,在Angular js中单击时删除HTML元素
- LeetCode MySQL 569. 员工薪水中位数(over窗口函数)
- Linux修改root用户登录密码
- thoughtworks面试题分析与解答
- BytePS源码解析
- Xshell官网登陆及软件下载,以及百度网盘免费提速
- ArcGIS Pro功能模块简介
- iPhone X(10)屏幕分辨率与适配
- 2008ESRI用户大会问答之ArcGIS部分
- C语言中的float(单精度浮点数)
热门文章
- 微服务配置中心是干啥的_配置中心微服务器配置
- python 判断列表list是否为空
- 【字节流处理】linux下uint8转float的注意事项
- IDEA-Java自动生成单元测试
- 2010河北职称计算机考试,2010年河北省职称计算机考试试题..doc
- redhat 7.3 mysql_RedHat7.3安装MySQL5.7
- yum安装nginx
- 【java 性能优化实战】2 深入剖析:哪些资源,容易成为瓶颈
- Python模拟登录,Python识别图形验证码实现自动登陆
- android checkbox状态不刷新,android开发分享更改checkbox的值,而不触发onCheckChanged