(1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边。

(2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点向F1的相邻的五个点连inf的边。

(3) 对每个位置再建一个点F3,这个点向T连same_science[i][j]的边,F1的相邻的五个点向这个点连inf的边。

先让ans等于所有art,science,same_art,same_science的和,减去最大流就是答案。

可以这么理解:

首先ans是将所有收益全部占全的答案,现在要减去的是冲突的收益。冲突分三种,一个点不能既选art又选science,只有相邻五个全部选同一科才会触发same收益,同一个点的两个same收益不可能同时触发。我们的建图只需要满足这三种情况都不出现即可。

第一种冲突显然由(1)直接解决了。

第二种冲突由(2)和(3)解决,可以发现,inf边肯定不会被割掉,也就是说“same[i][j]”和“i,j的五个相邻点存在选另一科”这两个只能选一个。

第三种冲突也很显然,一个点不可能art[i][j]和science[i][j]都不被割掉。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,M=,K=,inf=;
int n,m,ans,x,S,T,tot,cnt=,F1[K][K],F2[K][K],F3[K][K];
int to[M],f[M],nxt[M],h[N],dis[N],q[M]; void add(int u,int v,int w){
to[++cnt]=v; f[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt;
to[++cnt]=u; f[cnt]=; nxt[cnt]=h[v]; h[v]=cnt;
} bool bfs(){
rep(i,,T) dis[i]=; q[]=S; dis[S]=;
for (int st=,ed=; st<ed; ){
int x=q[++st];
For(i,x) if (f[i] && !dis[k=to[i]]) dis[k]=dis[x]+,q[++ed]=k;
}
return dis[T];
} int dfs(int x,int lim){
if (x==T) return lim;
int c=;
For(i,x) if (f[i] && dis[k=to[i]]==dis[x]+){
int t=dfs(k,min(lim-c,f[i]));
c+=t; f[i]-=t; f[i^]+=t;
if (c==lim) return c;
}
if (!c) dis[x]=-;
return c;
} int main(){
freopen("bzoj3894.in","r",stdin);
freopen("bzoj3894.out","w",stdout);
scanf("%d%d",&n,&m); S=*n*m+; T=*n*m+;
rep(i,,n) rep(j,,m) scanf("%d",&x),ans+=x,add(S,F1[i][j]=++tot,x);
rep(i,,n) rep(j,,m) scanf("%d",&x),ans+=x,add(F1[i][j],T,x);
rep(i,,n) rep(j,,m){
scanf("%d",&x); ans+=x;
add(S,F2[i][j]=++tot,x); add(F2[i][j],F1[i][j],inf);
if (i>) add(F2[i][j],F1[i-][j],inf);
if (i<n) add(F2[i][j],F1[i+][j],inf);
if (j>) add(F2[i][j],F1[i][j-],inf);
if (j<m) add(F2[i][j],F1[i][j+],inf);
}
rep(i,,n) rep(j,,m){
scanf("%d",&x); ans+=x;
add(F3[i][j]=++tot,T,x); add(F1[i][j],F3[i][j],inf);
if (i>) add(F1[i-][j],F3[i][j],inf);
if (i<n) add(F1[i+][j],F3[i][j],inf);
if (j>) add(F1[i][j-],F3[i][j],inf);
if (j<m) add(F1[i][j+],F3[i][j],inf);
}
while (bfs()) ans-=dfs(S,inf);
printf("%d\n",ans);
return ;
}

[BZOJ3894]文理分科(最小割)的更多相关文章

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

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

  2. 【BZOJ3894】文理分科 最小割

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

  3. 【BZOJ3894】【Luogu3358】文理分科 - 最小割多选一模型

    链接Click Here 这个题就是个板子的最小割多选一模型啦\(QwQ\),这里介绍一种通用的解法. 抛开组合收益不谈,这个题就是一个简单的最小割模型.我们只需要建出来这样一张图,在上面跑最小割,割 ...

  4. P4313 文理分科 最小割

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

  5. BZOJ 3894: 文理分科 [最小割]

    3894: 文理分科 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 674  Solved: 392[Submit][Status][Discuss] ...

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

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

  7. BZOJ3894/LuoguP4313 文理分科 (最小割)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  8. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

  9. [Bzoj3894]文理分科(最小割)

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

随机推荐

  1. HDU.2095(异或运算)

    find your present (2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  2. 如何用JavaScript做一个可拖动的div层

    可拖动的层在Web设计中用处很多,比如在某些需要自定义风格布局的应用中,控件就需要拖动操作,下面介绍一个,希望可以满足你的需求,顺便学习一下可拖动的层是如何实现的. 下面是效果演示: 这个DIV可以移 ...

  3. Expect使用小记

    By francis_hao    May 31,2017   本文翻译了部分Expect的man手册,只选取了个人常用的功能,因此并不完善.   Expect是一个可以和交互式程序对话的程序 概述 ...

  4. oralce的客户端sqlplus

    安装完oracle后,默认的客户端是sqlplus,还有一个公司常用的是PLSQLdeveloper 客户端软件,另外Navicat primie这个可以连接mysql.sqlserver.oracl ...

  5. 单选按钮radio与文字如何对齐?

    布局如下: <input type="radio" value="立即发送" name="a_1">立即发送 <input ...

  6. HDU2057

    http://acm.hdu.edu.cn/showproblem.php?pid=2057 涉及到16进制内的加法,可以用%I64x直接来处理,要注意到16进制中负数是用补码来表示的.一个比较困惑的 ...

  7. Spring - IoC(3): Bean 实例的创建方式

    创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML ...

  8. COGS2090 Asm.Def找燃料

    时间限制:1 s   内存限制:256 MB [题目描述] “听说咱们要完了?”比利·海灵顿拨弄着操纵杆,头也不回地问Asm.Def. “不要听得风就是雨.” “开个玩笑嘛.不就是打机器人,紧张啥,你 ...

  9. shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份

    有时我们需要将一个文件夹覆盖到我们的工作目录,但需要自动备份已经存在的文件,一个一个去备份太麻烦了,全部备份又没有必要.shell脚本可以很好滴完成这个任务.原文链接http://back.zhizh ...

  10. VS mfc MessageBox() 和 AfxMessageBox()

    转载:http://blog.csdn.net/phenixyf/article/details/41744039 一.MessageBox()用法 1.函数原型 Messagebox函数在Win32 ...