[BZOJ3894]文理分科(最小割)
(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]文理分科(最小割)的更多相关文章
- BZOJ3894文理分科——最小割
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
- 【BZOJ3894】文理分科 最小割
[BZOJ3894]文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
- 【BZOJ3894】【Luogu3358】文理分科 - 最小割多选一模型
链接Click Here 这个题就是个板子的最小割多选一模型啦\(QwQ\),这里介绍一种通用的解法. 抛开组合收益不谈,这个题就是一个简单的最小割模型.我们只需要建出来这样一张图,在上面跑最小割,割 ...
- P4313 文理分科 最小割
$ \color{#0066ff}{ 题目描述 }$ 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
- BZOJ 3894: 文理分科 [最小割]
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 674 Solved: 392[Submit][Status][Discuss] ...
- BZOJ 3894 Luogu P4313 文理分科 (最小割)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...
- BZOJ3894/LuoguP4313 文理分科 (最小割)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- [bzoj3894]文理分科_网络流_最小割
文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...
- [Bzoj3894]文理分科(最小割)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位 ...
随机推荐
- BZOJ 题解continue
1041 圆上的整点 暴力枚举 会超时 这道题很像之前一次noip模拟题(当时的我还太水了(虽然现在也很水)) x2+y2=R2 考虑变型 x2=(R+y)(R-y) int d=gcd(R,y) i ...
- git使用笔记(八)团队协作
By francis_hao Nov 24,2016 本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可.欢迎转载,请注明出处 ...
- 解决echarts中X轴文字过长的问题。【转】
axisLabel: { interval: , formatter:function(value) { debugger var ret = "";//拼接加\n返回的类目项 ; ...
- API网关Kong部署和使用文档
KONG安装使用说明 系统版本:ubuntu14 1.下载安装包 $ wget https://github.com/Mashape/kong/releases/download/0.8.3/kong ...
- POJ3189:Steady Cow Assignment(二分+二分图多重匹配)
Steady Cow Assignment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7482 Accepted: ...
- oracle的rownum使用
对于rownum来说它是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀. ...
- The base command for the Docker CLI.
Description The base command for the Docker CLI. Child commands Command Description docker attach At ...
- Windows下查看某个端口被哪个服务占用
1.查看某个端口是否被占用 打开命令行,输入:netstat -ano | findstr "3306" 2.查看端口被哪个服务占用 tasklist | findstr “PID ...
- Web应用程序开发,基于Ajax技术的JavaScript树形控件
感谢http://www.cnblogs.com/dgrew/p/3181769.html#undefined 在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用, ...
- [bzoj3669][Noi2014]魔法森林——lct
Brief description 给定一个无向图,求从1到n的一条路径使得这条路径上最大的a和b最小. Algorithm Design 以下内容选自某HN神犇的blog 双瓶颈的最小生成树的感觉, ...