BZOJ 2127 二元关系
题意:
思路:
先把所有的值加起来
最小割割哪儿 就代表那个地方不选
一减 剩下的就是 最大值了
//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 二元关系的更多相关文章
- [BZOJ 2127] happiness 【最小割】
题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)
题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...
- [置顶] [BZOJ]2127: happiness 最小割
happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...
- bzoj——2127: happiness
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2570 Solved: 1242[Submit][Status][D ...
- bzoj 2127: happiness
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
- [国家集训队]happiness 最小割 BZOJ 2127
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- BZOJ 2127 happiness ——网络流
[题目分析] 基本上是第一次真正的使用最小割的模型. 同时加上一个数然后最后再减去是处理负数的一种方法. 设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解. 这 ...
- bzoj 2127 happiness【最小割+dinic】
参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...
随机推荐
- DNS查询报文实例
2.2 DNS查询报文实例 以www.baidu.com为例,用Wireshark俘获分组,结合2.1的理论内容,很容易看明白的,DNS请求报文如下: 图7 DNS请求报文示例 2.3 DNS回答报文 ...
- C++ MAP使用
1. map的构造函数map<int,string> maphai;map<char,int> maphai;map<string,char> mapstring; ...
- 高并发之后端优化(PHP)
页面静态化 使用模板引擎 可以使用Smarty的缓存机制生成静态HTML缓存文件 $smarty->cachedir=$ROOT·"/cache"://缓存目录 $smart ...
- golang vue nginx
https://segmentfault.com/a/1190000012780963 https://blog.csdn.net/qq_32340877/article/details/790321 ...
- Ubuntu 16.04安装Caffe的记录及FCN官方代码的配置
相关内容搜集自官方文档与网络,既无创新性,也不求甚解,我也不了解Caffe,仅仅搭上之后做个记录,方便以后重装 安装依赖项sudo apt-get install libprotobuf-dev li ...
- this self指针
this 和 self指针 为函数提供了运行上下问:为函数提供了当前对象的其实地址,方便函数的对对象的访问.
- Kattis - How Many Digits?
How Many Digits? Often times it is sufficient to know the rough size of a number, rather than its ex ...
- LeetCode Golang 3. 无重复字符的最长子串
3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- CF992E Nastya and King-Shamans_线段树
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 200000 ...
- Unity5.X 创建基本的3D游戏场景
点New(新建懒得写了,反正不是智障应该都会) 创建好的项目会自带一个场景,场景会自带Main Camera (主摄像机),Directional Light (方向光) 系统自带几个可以创建的3 ...