BZOJ 2127: happiness [最小割]
2127: happiness
Time Limit: 51 Sec Memory Limit: 259 MB
Submit: 1815 Solved: 878
[Submit][Status][Discuss]
Description
高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。
Input
第一行两个正整数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列的同学同时选择理科获得的额外喜悦值。
Output
输出一个整数,表示喜悦值总和的最大值
Sample Input
1 1
100 110
1
1000
Sample Output
【样例说明】
两人都选理,则获得100+110+1000的喜悦值。
【数据规模】
对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- const int N=1e4+,M=1e5+,INF=1e9;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-; c=getchar();}
- while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
- return x*f;
- }
- int n,m,num,s,t,a[][],b[][],c,f[][],g[][],sum;
- struct edge{
- int v,c,f,ne;
- }e[M<<];
- int cnt,h[N];
- inline void ins(int u,int v,int c){
- cnt++;
- e[cnt].v=v;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[u];h[u]=cnt;
- cnt++;
- e[cnt].v=u;e[cnt].c=;e[cnt].f=;e[cnt].ne=h[v];h[v]=cnt;
- }
- inline void ins2(int u,int v,int c){
- cnt++;
- e[cnt].v=v;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[u];h[u]=cnt;
- cnt++;
- e[cnt].v=u;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[v];h[v]=cnt;
- }
- int q[N],head,tail,vis[N],d[N];
- bool bfs(){
- memset(vis,,sizeof(vis));
- memset(d,,sizeof(d));
- head=tail=;
- d[s]=;vis[s]=;
- q[tail++]=s;
- while(head!=tail){
- int u=q[head++];
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(!vis[v]&&e[i].c>e[i].f){
- vis[v]=;
- d[v]=d[u]+;
- q[tail++]=v;
- if(v==t) return true;
- }
- }
- }
- return false;
- }
- int cur[N];
- int dfs(int u,int a){
- if(u==t||a==) return a;
- int flow=,f;
- for(int &i=cur[u];i;i=e[i].ne){
- int v=e[i].v;
- if(d[v]==d[u]+&&(f=dfs(v,min(a,e[i].c-e[i].f)))>){
- flow+=f;
- e[i].f+=f;
- e[((i-)^)+].f-=f;
- a-=f;
- if(a==) break;
- }
- }
- return flow;
- }
- int dinic(){
- int flow=;
- while(bfs()){
- for(int i=s;i<=t;i++) cur[i]=h[i];
- flow+=dfs(s,INF);
- }
- return flow;
- }
- inline int id(int i,int j){return (i-)*m+j;}
- int main(){
- //freopen("in.txt","r",stdin);
- n=read();m=read();
- s=;t=n*m+;
- for(int i=;i<=n;i++) for(int j=;j<=m;j++) a[i][j]=read()<<,sum+=a[i][j]>>;
- for(int i=;i<=n;i++) for(int j=;j<=m;j++) b[i][j]=read()<<,sum+=b[i][j]>>;
- for(int i=;i<=n-;i++) for(int j=;j<=m;j++){
- c=read();a[i][j]+=c;a[i+][j]+=c;sum+=c;
- f[i][j]+=c;
- //ins2(id(i,j),id(i+1,j),c);
- }
- for(int i=;i<=n-;i++) for(int j=;j<=m;j++){
- c=read();b[i][j]+=c;b[i+][j]+=c;sum+=c;
- f[i][j]+=c;
- //ins2(id(i,j),id(i+1,j),c);
- }
- for(int i=;i<=n;i++) for(int j=;j<=m-;j++){
- c=read();a[i][j]+=c;a[i][j+]+=c;sum+=c;
- g[i][j]+=c;
- //ins2(id(i,j),id(i,j+1),c);
- }
- for(int i=;i<=n;i++) for(int j=;j<=m-;j++){
- c=read();b[i][j]+=c;b[i][j+]+=c;sum+=c;
- g[i][j]+=c;
- //ins2(id(i,j),id(i,j+1),c);
- }
- for(int i=;i<=n;i++) for(int j=;j<=m;j++){
- ins(s,id(i,j),a[i][j]);
- ins(id(i,j),t,b[i][j]);
- ins2(id(i,j),id(i+,j),f[i][j]);
- ins2(id(i,j),id(i,j+),g[i][j]);
- }
- int ans=dinic();
- printf("%d",sum-(ans>>));
- }
BZOJ 2127: happiness [最小割]的更多相关文章
- [置顶] [BZOJ]2127: happiness 最小割
happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...
- BZOJ 2127: happiness(最小割解决集合划分)
Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2350 Solved: 1138[Submit][Status][Discuss] Descript ...
- [BZOJ 2127] happiness 【最小割】
题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...
- BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)
题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...
- [国家集训队]happiness 最小割 BZOJ 2127
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- bzoj 2127 happiness【最小割+dinic】
参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...
- [bzoj2127]happiness——最小割
这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...
- spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】
因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...
- bzoj 2127: happiness
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
随机推荐
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
- 阿里云直播 C# SDK 如何使用
阿里云直播SDK的坑 1.直播云没有单独的SDK,直播部分被封装在CDN的相关SDK当中. 2.针对SDK,没有相关Demo. 3.针对SDK,没有相关的文档说明. 4.针对SDK的说明,官网上的说明 ...
- CSS十问——好奇心+刨根问底=CSSer
最近有时间,想把酝酿的几篇博客都写出来,今天前端小学生带着10个问题,跟大家分享一下学习CSS的一些体会,我觉得想学好CSS,必须保持一颗好奇心和刨根问底的劲头,而不是复制粘贴,得过且过.本人能力有限 ...
- Android 剪贴板详解
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...
- sql的那些事(一)
一.概述 书写sql是我们程序猿在开发中必不可少的技能,优秀的sql语句,执行起来吊炸天,性能杠杠的.差劲的sql,不仅使查询效率降低,维护起来也十分不便.一切都是为了性能,一切都是为了业务,你觉得你 ...
- 高仿it之家新闻客户端源码
仿it之家新闻客户端界面,数据为本地假数据.仅实现了新闻模块的功能. 源码下载:http://code.662p.com/list/11_1.html 详细说明:http://android.662p ...
- i++、++i 、i--、--i
总结: i++ 先用后加, ++i先加后用: i--先用后减, --i先减后用: //int i = 1; //Console.WriteLine(i);//1 //Console.WriteLine ...
- 2003-Can't connect to mysql server on localhost (10061)
mysql数据库出现2003-Can't connect to mysql server on localhost (10061)问题 解决办法:查看wampserver服务器是否启动,如果没有启动启 ...
- Linux网卡驱动安装、防火墙原理
安装网卡驱动程序: 需要检查是否安装kernel依赖包: rpm –q kernel-devel #检查kernel依赖包是否安装 yum –y install kernel-devel 检查gcc和 ...
- 烂泥:VMWare Workation双网卡配置IP地址
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前几天给一个客户做远程项目实施,客户那边的服务器是Windows OS的,我们这边的业务 ...