[Bzoj3894]文理分科(最小割)
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想知道,大家应该如何选择,才能使所有人的满意值之和最大。请告诉他这个最大值。
Solution
这是一道最小割的题目,关键在建图
Code
#include <cstdio>
#include <algorithm>
#define N 1000010
#define Inf 0x7fffffff
using namespace std;
const int dx[]={0,0,0,1,-1};
const int dy[]={0,1,-1,0,0};
struct info{int to,nex,f;}e[N];
int n,m,T,S,tot,nodes,head[N],Ans,cnt[N],dis[N],sum;
inline void Link(int u,int v,int f){
e[++tot].to=v;e[tot].nex=head[u];head[u]=tot;e[tot].f=f;
e[++tot].to=u;e[tot].nex=head[v];head[v]=tot;e[tot].f=0;
}
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void Init(){
n=read(),m=read();
S=0,tot=1,nodes=(T=n*m*3+1)+1;
for(int i=1;i<=n*m;++i){int t=read();sum+=t;Link(S,i,t);}
for(int i=1;i<=n*m;++i){int t=read();sum+=t;Link(i,T,t);}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
int t=read(),cur=(i-1)*m+j;
sum+=t;
Link(S,cur+m*n,t);
for(int k=0;k<5;++k){
int x=i+dx[k],y=j+dy[k];
if(x<=0||y<=0||x>n||y>m) continue;
Link(cur+m*n,(x-1)*m+y,Inf);
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
int t=read(),cur=(i-1)*m+j;
sum+=t;
Link(cur+2*m*n,T,t);
for(int k=0;k<5;++k){
int x=i+dx[k],y=j+dy[k];
if(x<=0||y<=0||x>n||y>m) continue;
Link((x-1)*m+y,cur+2*m*n,Inf);
}
}
}
int sap(int u,int d){
if(u==T) return d;
int sum=0,mins=nodes;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(e[i].f>0&&dis[u]==dis[v]+1){
int save=sap(v,min(d-sum,e[i].f));
sum+=save;
e[i].f-=save;
e[i^1].f+=save;
if(dis[S]>=nodes||sum==d) return sum;
}
if(e[i].f>0) mins=min(mins,dis[v]);
}
if(!sum){
if(!(--cnt[dis[u]])) dis[S]=nodes;
else ++cnt[dis[u]=mins+1];
}
return sum;
}
void SAP(){cnt[0]=nodes;while(dis[S]<nodes) Ans+=sap(S,Inf);}
int main(){
Init();
SAP();
printf("%d\n",sum-Ans);
return 0;
}
[Bzoj3894]文理分科(最小割)的更多相关文章
- BZOJ3894文理分科——最小割
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
- [BZOJ3894]文理分科(最小割)
(1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...
- 【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 ...
随机推荐
- 如何让MVC和多层架构和谐并存(二)
上一节说了一些笼统的东西,这节说一些实际的操作. 1.取列表.这是一个新闻列表: 对应MVC的model是: public class NewsListModel { /// < ...
- 监控系统 - pnp4nagios
pnp4nagios是nagios的一个插件,用于将perfdata数据写入rrd,用于展示流量图,目前最高版本0.6.25. 我用官方下载的tar.gz打rpm包,官方提供的pnp4nagios.s ...
- SQL的注入式攻击方式和避免方法
SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...
- EF分组后把查询的字段具体映射到指定类里面的写法
//先做基本查询 var querySql = from l in _logClinicDataOperationRepository.Table select new LogClinicDataOp ...
- 单调队列 poj2823,fzu1894
题目链接:http://poj.org/problem?id=2823 用RMQ超时了,我想应该是不会的,看discuss说,之前RMQ过了. 维护两个单调队列. 单调递减的队列,每插入一个时: 超过 ...
- Java解析Excel工具类(兼容xls和xlsx)
依赖jar <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml&l ...
- Spring Security 实现记住我
开篇一张图,道理全靠悟. 示例如下: 1. 新建Maven项目 remember_me 2. pom.xml <project xmlns="http://maven.ap ...
- javaweb基础(35)_jdbc处理oracl大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- window环境下安装node.js
在使用sublime text 3 过程中,node.js装了好几次都没有成功,今天终于成功了,现将安装过程整理一下. 安装过程中主要参考了以下代码: 第一,下载文件 https://nodejs.o ...
- jeDate日期控件
http://www.jayui.com/jedate/ 这是日期控件官网,可以去里面下载使用 前台 <%@ Page Language="C#" AutoEvent ...