题意:



思路:





先把所有的值加起来

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

一减 剩下的就是 最大值了

//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. 欢迎来到Flask的世界

    不多说,直接上文档链接:Flask的文档 教程 API 快速上手

  2. php链接memcache操作

    设置值 set key 压缩标识 有效期 长度 set name 0 60 5 hello 压缩标识:用于告诉memcached服务器是否压所后存储数据,目的是为了节省磁盘空间,压所和解压缩会消耗时间 ...

  3. (转)Django学习之 第四章:Django模板系统

    前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的 这会导致几个问题: 1.显然,任何页面的改动会牵扯到Python代码的改动 网站的设计改动会比Python代码改 ...

  4. DirectUI界面编程(三)从XML文件中加载界面

    Duilib支持xml界面布局,使得界面设计与逻辑处理相分离,本节介绍如何从xml文件中加载界面元素. 我们需要以下几个步骤: 创建并初始化CPaintManagerUI对象. 创建CDialogBu ...

  5. Win7 disk.sys无法加载的问题

    Win7突然无法启动,应该说是启动中卡死,没有别的问题,用安全模式,显示加载disk.sys时卡死.搜索发现很多人遇到这个问题. 实际解决方法是查看数据线,重新插拔,换口,换线. 数据线出现故障往往表 ...

  6. C/C++中的函数指针

    C/C++中的函数指针 一.引子 今天无聊刷了leetcode上的一道题,如下: Median is the middle value in an ordered integer list. If t ...

  7. ZBrush中如何使用套索工具绘制遮罩

    ZBrush®中创建遮罩的方法有很多,可以手动创建矩形遮罩.圆形遮罩和图案遮罩,然而这些遮罩都是固定的形状.使用Zbrush中的套索遮罩能够实现不规则的图形遮罩,游刃有余的发挥创作. 使用套索工具绘制 ...

  8. EFCore笔记之查询数据

    查询数据 基础查询,Linq100实例: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b using (var context = ...

  9. 路飞学城Python-Day31

    19-生产者消费者模型 生产者:生成数据的任务 消费者:处理数据的任务 在并发编程的过程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理,才能继续生产数据:同样的,如果 ...

  10. Pyhton学习——Day30

    # 内核态# 用户态# 操作系统的运行是在BOIS启动盘读取代码,从硬盘读取到内存中,被操作系统的内核中,一直存在在内存中# 计算机系统的三层结构:应用软件-->操作系统-->硬件# 一般 ...