题意:



思路:





先把所有的值加起来

最小割割哪儿 就代表那个地方不选

一减 剩下的就是 最大值了

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=105,M=10005,K=300050,inf=0x3f3f3f3f;
int n,m,T,cnt,tot,ans;
int A[N][N],B[N][N],C[N][N],D[N][N],E[N][N],F[N][N],id[N][N];
int first[M],next[K],v[K],w[K],q[M],vis[M];
void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}
bool tell(){
memset(vis,-1,sizeof(vis)),vis[0]=0;
int head=0,tail=0;
while(head<=tail){
int t=q[head++];
for(int i=first[t];~i;i=next[i])if(!~vis[v[i]]&&w[i])
vis[v[i]]=vis[t]+1,q[++tail]=v[i];
}return ~vis[T];
}
int zeng(int x,int y){
if(x==T)return y;
int r=0;
for(int i=first[x];~i&&y>r;i=next[i])if(vis[v[i]]==vis[x]+1&&w[i]){
int t=zeng(v[i],min(y-r,w[i]));
w[i]-=t,w[i^1]+=t,r+=t;
}if(!r)vis[x]=-1;
return r;
}
int main(){
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&m),T=n*m+1;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&A[i][j]),id[i][j]=++cnt;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&B[i][j]);
for(int i=1;i<n;i++)for(int j=1;j<=m;j++)scanf("%d",&C[i][j]);
for(int i=1;i<n;i++)for(int j=1;j<=m;j++)scanf("%d",&D[i][j]);
for(int i=1;i<=n;i++)for(int j=1;j<m;j++)scanf("%d",&E[i][j]);
for(int i=1;i<=n;i++)for(int j=1;j<m;j++)scanf("%d",&F[i][j]);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
add(0,id[i][j],A[i][j]*2),add(id[i][j],T,B[i][j]*2),ans+=A[i][j]+B[i][j];
for(int i=1;i<n;i++)for(int j=1;j<=m;j++){
add(0,id[i][j],C[i][j]),add(0,id[i+1][j],C[i][j]);
add(id[i][j],T,D[i][j]),add(id[i+1][j],T,D[i][j]);
add(id[i][j],id[i+1][j],C[i][j]+D[i][j]);
add(id[i+1][j],id[i][j],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++){
add(0,id[i][j],E[i][j]),add(0,id[i][j+1],E[i][j]);
add(id[i][j],T,F[i][j]),add(id[i][j+1],T,F[i][j]);
add(id[i][j],id[i][j+1],E[i][j]+F[i][j]);
add(id[i][j+1],id[i][j],E[i][j]+F[i][j]);
ans+=E[i][j]+F[i][j];
}ans*=2;
while(tell())while(m=zeng(0,inf))ans-=m;
printf("%d\n",ans/2);
}

BZOJ 2127 二元关系的更多相关文章

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

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

  2. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

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

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

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

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

  5. bzoj——2127: happiness

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2570  Solved: 1242[Submit][Status][D ...

  6. bzoj 2127: happiness

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

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

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

  8. BZOJ 2127 happiness ——网络流

    [题目分析] 基本上是第一次真正的使用最小割的模型. 同时加上一个数然后最后再减去是处理负数的一种方法. 设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解. 这 ...

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

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

随机推荐

  1. maven冲突管理及依赖管理实践

    1.“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突 Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即如果一个项目最终 ...

  2. 解决VS不能智能提示

    前一段时间在电脑上装了VS2013,导致VS2010上不能正常进行单元测试,折腾了一番,把VS2013又给卸载了,结果发现VS2010的智能提示没有了,没有就没有吧,懒的去管,就一直用 Ctrl + ...

  3. 修改eclipse最近访问的工程的配置文件

    此文件为:org.eclipse.ui.ide.prefs 配置项为:RECENT_WORKSPACES= 示例:RECENT_WORKSPACES=E\:\\Workspaces\\wokspace ...

  4. Servlet基础(二)

    1.什么是Servlet   java类,提供web形式的访问   servlet就是按照javaee中servlet规范所编写的java类   能够被浏览器通过URL形式访问到 2.怎么在javae ...

  5. <Android Framework 之路>Android5.1 Camera Framework(四)——框架总结

    前言 从之前的几篇文件,可以基本弄清楚 Camera从APK,经过framework的衔接,与HAL层进行交互,最终通过驱动完成Camera的一些动作. Camera层次分析 APP层 Framewo ...

  6. (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结

    Android项目实战(二十七):数据交互(信息编辑)填写总结   前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: ...

  7. sql调优《二》

    1.数据库设计(是否复合范式,是否合理归档.分区.分表等) 2.硬件基础架构 (设备规格,硬件性能,负载均衡,容灾等) 3.ql语句的写法.索引和统计信息,事务和锁,应用程序访问代码(连接过多.频繁开 ...

  8. ZBrush中如何反选遮罩

    通过对ZBrush的学习,我们知道了如何手动创建遮罩,手动创建遮罩相对来说是最简单有效的方法,在某些特定的使用场合会起到事半功倍的效果.创建遮罩我们可以结合Ctrl键在物体保持编辑的状态下来执行,您可 ...

  9. ZBrush常用快捷键

    ZBrush是一款数字雕刻和绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维雕刻行业.强大的功能离不开便捷的操作,为此ZBrush®提供了一系列常用操作快捷键,熟练掌握这些快捷键,可帮助您节 ...

  10. JS 数值转换、加减乘除

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...