BZOJ 2127: happiness [最小割]

时间:2021-04-14 10:33:06

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 2
1 1
100 110
1
1000

Sample Output

1210
【样例说明】
两人都选理,则获得100+110+1000的喜悦值。
【数据规模】
对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数

本题和上一题很相似,可以用相同的做法
但是本题可以优化
相邻两个人具有经典的棋盘黑白染色的特征,虽然本题貌似与二分图无关,这是句废话
能不能在一人一点的基础上直接处理出神秘加成
放弃文同时也是放弃了 神秘加成_文/2
两个人都放弃文就成功的放弃了整个 神秘加成_文
理同理
但是一人选文一人选理两个神秘加成都不能要啊,但这样每个神秘加成只放弃了1/2
那就再加两条边,链接相邻两个人,容量为(神秘加成_文+神秘加成_理)/2,割的时候一文一理时必定割去这条两条边之一
 
提示:
那两条边可以直接加无向边
注意:
煞笔Candy?数组开成[10005][10005] bzoj不是T就是M
#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 [最小割]的更多相关文章

  1. &lbrack;置顶&rsqb; &lbrack;BZOJ&rsqb;2127&colon; happiness 最小割

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

  2. BZOJ 2127&colon; happiness&lpar;最小割解决集合划分&rpar;

    Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2350  Solved: 1138[Submit][Status][Discuss] Descript ...

  3. &lbrack;BZOJ 2127&rsqb; happiness 【最小割】

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

  4. BZOJ 2127 &sol; Luogu P1646 &lbrack;国家集训队&rsqb;happiness &lpar;最小割&rpar;

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

  5. &lbrack;国家集训队&rsqb;happiness 最小割 BZOJ 2127

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

  6. bzoj 2127 happiness【最小割&plus;dinic】

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

  7. &lbrack;bzoj2127&rsqb;happiness——最小割

    这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...

  8. spoj 839 OPTM - Optimal Marks&amp&semi;&amp&semi;bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  9. bzoj 2127&colon; happiness

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

随机推荐

  1. spark2&period;0&period;1 安装配置

    1. 官网下载 wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.1-bin-hadoop2.7.tgz 2. 解压 tar -zxvf spar ...

  2. JavaScript中的事件

    1.冒泡事件:事件按照特定的的事件目标到最不特定的事件目标顺序触发(它是按照DOM的层次节后依次做出的反应) 2.捕获事件:事件从不确定的对象document 开始触发然后到最精确(也可以在窗口级别捕 ...

  3. mysql 命令重命名表RENAME TABLE 句法

    mysql 命令重命名表RENAME TABLE 句法 RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2,...]更 ...

  4. Fresco好案例

    http://www.open-open.com/lib/view/open1436094840774.html

  5. C&num; 中间语言、CLR、CTS、CLS

    c#  中间语言.CLR.CTS.CLS IL中间语言,区分大小写 中间语言的主要特征: 1.  面向 对象和使 用接口 2. 值类型和引 用类 型之间的 显 著差异 3.  强 数据类型化 4. 使 ...

  6. 数据结构c字符串操作语言版本

    #include<stdio.h> #include<malloc.h> #include<string.h> //结构的定义字符串 typedef struct ...

  7. &lbrack; Talk is Cheap Show me the CODE &rsqb; &colon; jQuery Mobile页面布

    [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局 当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,或许我们正在阿谀逢迎自己懒惰的天 ...

  8. BZOJ3202 &lbrack;Sdoi2013&rsqb;项链

    Problem E: [Sdoi2013]项链 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 427  Solved: 146[Submit][Sta ...

  9. Unite&&num;39&semi;17 Shanghai再一次问候

    Unite'17 Shanghai再一次问候 --暨Unity2017年度大会 2017年5月11日,主题为"再一次问候"的Unity年度盛会在上海国际会议中心举行,这是Unity ...

  10. 泛型--增强for循环--数组和集合转换

    1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ...