BZOJ2127Happiness
题目描述
高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。
题解
这道题相当于给了我们一堆二元关系。容易想到用二元关系最小割来解决。
我们设学文的收益为w,学理的收益为l,同时学文的收益为w‘,同时学理的收益为w’。
那么考虑割集。
\]
\]
\]
\]
弄完之后发现有分数,乘个2就好了。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define N 30009
#define M 109
#define inf 1e9
using namespace std;
queue<int>q;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
int num,tot=1,head[N],cur[N],deep[N],n,m,a[M][M],s_a[M][M],s[M][M],s_s[M][M],id[M][M];
long long ans;
inline int rd(){
int x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct edge{
int n,to,l;
}e[N*30];
inline void add(int u,int v,int l,int tag){
e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].l=l;
e[++tot].n=head[v];e[tot].to=u;head[v]=tot;e[tot].l=l*tag;
}
bool bfs(int s,int t){
memcpy(cur,head,sizeof(head));
memset(deep,0,sizeof(deep));
q.push(s);deep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].n){
int v=e[i].to;
if(!deep[v]&&e[i].l){
deep[v]=deep[u]+1;
q.push(v);
}
}
}
return deep[t];
}
int dfs(int u,int t,int l){
if(u==t||!l)return l;
int flow=0,f;
for(int &i=cur[u];i;i=e[i].n){
int v=e[i].to;
if(deep[v]==deep[u]+1&&(f=dfs(v,t,min(l,e[i].l)))){
e[i].l-=f;e[i^1].l+=f;flow+=f;l-=f;
if(!l)break;
}
}
return flow;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)a[i][j]=rd()*2,id[i][j]=++num,ans+=a[i][j];
int S=0,T=num+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)s[i][j]=rd()*2,ans+=s[i][j];
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j){
s_a[i][j]=rd();ans+=s_a[i][j]*2;
a[i][j]+=s_a[i][j],a[i+1][j]+=s_a[i][j];
}
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j){
s_s[i][j]=rd();ans+=s_s[i][j]*2;
s[i][j]+=s_s[i][j];s[i+1][j]+=s_s[i][j];
add(id[i][j],id[i+1][j],s_a[i][j]+s_s[i][j],1);
}
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j){
s_a[i][j]=rd();ans+=s_a[i][j]*2;
a[i][j]+=s_a[i][j],a[i][j+1]+=s_a[i][j];
}
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j){
s_s[i][j]=rd();ans+=s_s[i][j]*2;
s[i][j]+=s_s[i][j];s[i][j+1]+=s_s[i][j];
add(id[i][j],id[i][j+1],s_a[i][j]+s_s[i][j],1);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)add(S,id[i][j],a[i][j],0),add(id[i][j],T,s[i][j],0);
while(bfs(S,T))ans-=dfs(S,T,inf);
ans/=2;
cout<<ans;
return 0;
}
BZOJ2127Happiness的更多相关文章
- BZOJ-2127-happiness(最小割)
2127: happiness(题解) Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1806 Solved: 875 Description 高一 ...
- BZOJ2127happiness——最小割
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- bzoj2127happiness(最小割)
一眼最小割. 一种比较好想的建图方式如下: 连源点表示学文,连汇点表示学理,然后adde(S,id(i,j),a[i][j]),adde(id(i,j),T,b[i][j]):对于相邻座位选择同一科的 ...
- BZOJ2132 圈地计划 【最小割】
题目 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解, 这块土地是一块矩形的区域,可以纵横划分 ...
随机推荐
- .NET开发中基础问题,CODE First AND DB First(大牛自动忽略,小白可以看一下)
最近在做一个新项目开发时,碰到了下面这个问题.在使用EF时,提示错误信息 To continue using Database First or Model First ensure that the ...
- Java虚拟机垃圾收集算法
1.标记-清除算法 标记-清除算法分为 "标记" 和 "清除" 两个步骤:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象,是垃圾收集算法 ...
- Arrays工具、二维数组以及LeetCode练习题
1 Arrays PS:Arrays位于java.util包下 int binarySearch(type[] a, type key); 使用二分法查询 key 元素在 a 数组中的索引,如果数组不 ...
- 小米平板6.0系统如何无ROOT激活xposed框架的步骤
在较多企业的引流,或业务操作中,基本上都需要使用安卓的黑高科技术Xposed框架,近期,我们企业购买了一批新的小米平板6.0系统,基本上都都是基于7.0以上系统,基本上都不能够获得ROOT的su权限, ...
- Android 报错:error: too many padding sections on bottom border
一.发生错误 [我以为我做了一张完美的.9图片,没想到.9图片还需要画左边和上边,尴尬···] 二.解决方法 .9图片造成错误 [具体内容] 最后修改.9图为
- 高通MSM8998 ABL的调试
高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...
- node.js微信小程序配置消息推送
在开发微信小程序时,有一个消息推送,它的解释是这样的. 消息推送具体的内容是下面的这个网址 https://developers.weixin.qq.com/miniprogram/dev/fra ...
- 谈下git的基本操作
在工作之后,我比较经常地接触git,关于git的用法,网上有很多的教程,而且git的指令是非常多的,强如阮一峰这样的高手也直言无法记住git的很多指令.实际上我也看了不少关于git指令的文章,个人觉得 ...
- clamwin + 拖拽查毒+右键查毒
下载 clamwin 到 windows 并安装 http://www.clamwin.com/ 为了方便使用clamwin,写一个bat,实现拖拽到bat 自动查毒 @echo off mode c ...
- SSM —— 注解解析
@Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用. @Controller通过@Controller注解说明该类非 ...