【BZOJ3894】文理分科(最小割)

题面

BZOJ

Description

文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠
结过)
小P所在的班级要进行文理分科。他的班级可以用一个n*m的矩阵进行
描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择
一科。同学们在选择科目的时候会获得一个满意值。满意值按如下的方式
得到:
1.如果第i行第秒J的同学选择了文科,则他将获得art[i][j]的满意值,如
果选择理科,将得到science[i][j]的满意值。
2.如果第i行第J列的同学选择了文科,并且他相邻(两个格子相邻当且
仅当它们拥有一条相同的边)的同学全部选择了文科,则他会更开
心,所以会增加same_art[i][j]的满意值。
3.如果第i行第j列的同学选择了理科,并且他相邻的同学全部选择了理
科,则增加same_science[i]j[]的满意值。
小P想知道,大家应该如何选择,才能使所有人的满意值之和最大。请
告诉他这个最大值。

Input

第一行为两个正整数:n,m
接下来n术m个整数,表示art[i][j];
接下来n术m个整数.表示science[i][j];
接下来n术m个整数,表示same_art[i][j];

Output

输出为一个整数,表示最大的满意值之和

Sample Input

3 4

13 2 4 13

7 13 8 12

18 17 0 5

8 13 15 4

11 3 8 11

11 18 6 5

1 2 3 4

4 2 3 2

3 1 0 4

3 2 3 2

0 2 2 1

0 2 4 4

Sample Output

152

题解

最小割傻逼题
先假设所有的贡献都能够那道
然后考虑最小割,源点汇点分别表示文理科
再额外建设新点,表示如果同一个集合内都在一侧则可以拿到额外贡献。
新点分别向源点汇点连边,向所有集合内的点连\(INF\)的边
然后求最小割即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 33333
#define INF 2147483647
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
int d[4][2]={1,0,0,1,-1,0,0,-1};
struct Line{int v,next,w;}e[333333];
int h[MAX],cnt=2;
inline void Add(int u,int v,int w)
{e[cnt]=(Line){v,h[u],w};h[u]=cnt++;e[cnt]=(Line){u,h[v],0};h[v]=cnt++;
}
int level[MAX],S,T;
bool bfs()
{memset(level,0,sizeof(level));level[S]=1;queue<int> Q;Q.push(S);while(!Q.empty()){int u=Q.front();Q.pop();for(int i=h[u];i;i=e[i].next)if(e[i].w&&!level[e[i].v])level[e[i].v]=level[u]+1,Q.push(e[i].v);}return level[T];
}
int dfs(int u,int flow)
{if(u==T||!flow)return flow;int ret=0;for(int i=h[u];i;i=e[i].next)if(e[i].w&&level[e[i].v]==level[u]+1){int d=dfs(e[i].v,min(flow,e[i].w));ret+=d;flow-=d;e[i].w-=d;e[i^1].w+=d;}if(!ret)level[u]=0;return ret;
}
int Dinic()
{int ret=0;while(bfs())ret+=dfs(S,INF);return ret;
}
int ans,n,m,bh[111][111],tot;
int main()
{n=read();m=read();for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)bh[i][j]=++tot;S=0;T=tot+tot+tot+1;for(int i=1,x;i<=n;++i)for(int j=1;j<=m;++j)x=read(),Add(S,bh[i][j],x),ans+=x;for(int i=1,x;i<=n;++i)for(int j=1;j<=m;++j)x=read(),Add(bh[i][j],T,x),ans+=x;int now=tot;for(int i=1,x;i<=n;++i)for(int j=1;j<=m;++j){x=read(),ans+=x,++now;Add(now,bh[i][j],INF);for(int k=0;k<4;++k){int xx=i+d[k][0],yy=j+d[k][1];if(!xx||!yy||xx>n||yy>m)continue;Add(now,bh[xx][yy],INF);}Add(S,now,x);}for(int i=1,x;i<=n;++i)for(int j=1;j<=m;++j){x=read(),ans+=x,++now;Add(bh[i][j],now,INF);for(int k=0;k<4;++k){int xx=i+d[k][0],yy=j+d[k][1];if(!xx||!yy||xx>n||yy>m)continue;Add(bh[xx][yy],now,INF);}Add(now,T,x);}printf("%d\n",ans-Dinic());return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/8724036.html

【BZOJ3894】文理分科(最小割)相关推荐

  1. LuoguP4313 BZOJ3894 文理分科——最小割

    洛谷:文理分科 传送门 题目描述: 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位同学必须从文科和理科中选择一科.同学们在选择科目的时候会获得一 ...

  2. bzoj3894 文理分科 最小割

    Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...

  3. 文理分科 (最小割问题)

    Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位同学 ...

  4. bzoj 3894: 文理分科 最小割

    Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...

  5. BZOJ 3894 Luogu P4313 文理分科 (最小割)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...

  6. BZOJ 3894 文理分科 最小割

    题目大意:给定一个m*n的矩阵,每个格子的人可以学文或者学理,学文和学理各有一个满意度,如果以某人为中心的十字内所有人都学文或者学理还会得到一个额外满意度,求最大满意度之和 令S集为学文,T集为学理 ...

  7. 【BZOJ3894】文理分科 最小割 (再不刷它就土了,毕竟水题)

    #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csdn.ne ...

  8. BZOJ3894 文理分科

    BZOJ3894 文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个 ...

  9. BZOJ3894: 文理分科

    BZOJ3894: 文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科. 他的班级可以用一个n*m的矩阵进行描述,每个 ...

  10. BZOJ3894:文理分科

    https://blog.csdn.net/PoPoQQQ/article/details/43968017 求最大收益->总收益-最小的丢失->最小割. 对于直接选文理很简单,直接把点分 ...

最新文章

  1. linux下的C语言开发 GDB的例子
  2. java获取id值_从另一页获取ID值[重复]
  3. boost shared_ptr线程安全性
  4. 这些令人仰望的C++大咖,都是怎样炼成的?
  5. 【测试点分析】1088 三人行 (20分)_29行代码AC
  6. C#WebClient常见用法
  7. KCdoes NetUSB 严重漏洞影响多家厂商的数百万台路由器
  8. memcached可视化工具 treeNMS通用的安装方法(windows、mac、linux)
  9. 通过easyexcel将文本文件转为excel xlsx文件
  10. 我的Java学习笔记(二)飞机大战小游戏
  11. Win7系统解决无法打开任务管理器
  12. 阿里云Nginx配置站点403Forbidden问题
  13. 邂逅APP + 网站平台的产品设想
  14. 用PyMOL展示配体和受体相互作用的原子和氢键
  15. 【转载】租房被骗,选择忍让,成就黑中介的猖狂
  16. Linux 下 美化字体
  17. 图像识别VPU——易用的嵌入式AI支持深度学习平台介绍
  18. java中new一个对象时具体都发生了什么?
  19. LeetCode 2409. 统计共同度过的日子数
  20. 手机号码为344格式

热门文章

  1. 消息队列控制灯代码_基于ARM的智能灯光控制系统经验总结分享
  2. ppt地图分布图一块一块的怎么做_没想到PPT还能这样做动态地图,实在是太炫酷了,用了再也离不开...
  3. crontab命令 :Linux下定时执行脚本
  4. 【2019华东交通校赛:H】谁在说谎(思维)
  5. requests模块中使用代理proxy发送请求
  6. php冗余,php – 如何使用规范化删除冗余?
  7. 弹性地基梁板的计算理论_龚晓南院士:30年创新实践,为地基处理开出“良方”...
  8. Python3面向对象:实例(instance)
  9. Pandas:金融数据下载和分析
  10. 互联网知识:工作多年的程序员都说不全