bzoj2127happiness(最小割)
一眼最小割。
一种比较好想的建图方式如下:
连源点表示学文,连汇点表示学理,然后adde(S,id(i,j),a[i][j]),adde(id(i,j),T,b[i][j]);对于相邻座位选择同一科的情况,建立新节点,然后若学文,则新点向T连一条流量为价值的边,然后两名同学向该点连接流量为inf的边。学理也是类似的。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define FOR(x,y) for(int i=1;i<=x;i++)for(int j=1;j<=y;j++)
const int N=,M=3e5+;
using namespace std;
int n,m,T,cnt,tot,ans,hd[N],lv[N],q[N],v[M],nxt[M],w[M];
void adde(int x,int y,int z)
{
v[++cnt]=y,w[cnt]=z,nxt[cnt]=hd[x],hd[x]=cnt;
v[++cnt]=x,w[cnt]=,nxt[cnt]=hd[y],hd[y]=cnt;
}
bool bfs()
{
int qs=,qe=;
memset(q,,sizeof q);
memset(lv,,sizeof lv);
q[]=,lv[]=;
while(qs<qe)
{
int u=q[qs++];
if(u==T)break;
for(int i=hd[u];i;i=nxt[i])
if(w[i]&&!lv[v[i]]){lv[v[i]]=lv[u]+;q[qe++]=v[i];}
}
if(lv[T])return ;return ;
}
int dfs(int u,int low)
{
if(u==T||!low)return low;
int sum=;
for(int i=hd[u];i;i=nxt[i])
if(w[i]&&lv[v[i]]==lv[u]+)
{
int tmp=dfs(v[i],min(w[i],low));
sum+=tmp,low-=tmp,w[i]-=tmp,w[i^]+=tmp;
if(!low)return sum;
}
if(low)lv[u]=-;
return sum;
}
int id(int x,int y){return(x-)*m+y;}
int main()
{
scanf("%d%d",&n,&m);
T=*n*m+,cnt=,tot=n*m;
int x;
FOR(n,m)scanf("%d",&x),adde(,id(i,j),x),ans+=x;
FOR(n,m)scanf("%d",&x),adde(id(i,j),T,x),ans+=x;
FOR(n-,m)
scanf("%d",&x),tot++,adde(,tot,x),adde(tot,id(i,j),1e9),adde(tot,id(i+,j),1e9),ans+=x;
FOR(n-,m)
scanf("%d",&x),tot++,adde(tot,T,x),adde(id(i,j),tot,1e9),adde(id(i+,j),tot,1e9),ans+=x;
FOR(n,m-)
scanf("%d",&x),tot++,adde(,tot,x),adde(tot,id(i,j),1e9),adde(tot,id(i,j+),1e9),ans+=x;
FOR(n,m-)
scanf("%d",&x),tot++,adde(tot,T,x),adde(id(i,j),tot,1e9),adde(id(i,j+),tot,1e9),ans+=x;
while(bfs())ans-=dfs(,1e9);
printf("%d",ans);
}
bzoj2127happiness(最小割)的更多相关文章
- BZOJ2127happiness——最小割
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- BZOJ-2127-happiness(最小割)
2127: happiness(题解) Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1806 Solved: 875 Description 高一 ...
- BZOJ2132 圈地计划 【最小割】
题目 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解, 这块土地是一块矩形的区域,可以纵横划分 ...
- BZOJ 1391: [Ceoi2008]order [最小割]
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1509 Solved: 460[Submit][Statu ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- BZOJ3438 小M的作物(最小割)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- bzoj1412最小割
太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...
- 【BZOJ1497】[NOI2006]最大获利 最小割
裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...
随机推荐
- vue学习(十)mixin 偷懒
一 mixin混入偷懒技术 架子 <div id="app"> {{msg}} </div> <script> let app = new Vu ...
- spring 动态bean注册
1. import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory. ...
- 第一部分 JavaScript语言核心(一)
第二章 词法结构 P25 JavaScript是区分大小写的语言:但HTML不区分大小写(XHTML区分大小写,但浏览器具有强大的纠错能力.) 第三章 类型.变量和值 P32 var(variable ...
- 学习spring的第三天
1.手动的依赖注入出了昨天所讲的利用<property>和<constructor-arg>标签设置注入外还可以通过属性值设置,这样就少些了一些代码... 1.1:直接在< ...
- bat 卸载程序的脚本
@echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions & ...
- Spark-大数据计算引擎
Spark简介: Spark是一个快速且通用的集群计算平台,可以处理大数据量时候,比如几T到几P量级时候只需要几秒钟到几分钟,相对于hadoop几分钟到几小时速度是很快的,通用是指Spark的使用场景 ...
- Day2-T2
原题目 Describe:贪心,保证至少一条路牛的数量最多 code: #include<bits/stdc++.h> using namespace std; long long n,m ...
- 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现
文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...
- mysql第四篇:数据操作
第四篇:数据操作 一.数据操作介绍 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作 1.INSERT实现数据的插入 2.UPDATE实现数据的更新 3.DELETE实现数据的 ...
- 分页助手PageHelper学习
PageHelper是mybatis的通用分页插件,通过mybatis的拦截器实现分页功能,拦截sql查询请求,添加分页语句, 最终实现分页查询功能.在 springboot上集成pagehelper ...