BZOJ-2127-happiness(最小割)
2127: happiness(题解)
Time Limit: 51 Sec Memory Limit: 259 MB
Submit: 1806 Solved: 875
Description
高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。
Input
第一行两个正整数n,m。接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值。第二个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择理科获得的喜悦值。第三个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择文科获得的额外喜悦值。第四个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择理科获得的额外喜悦值。第五个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择文科获得的额外喜悦值。第六个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择理科获得的额外喜悦值。
Output
输出一个整数,表示喜悦值总和的最大值
Sample Input
1 1
100 110
1
1000
Sample Output
【样例说明】
两人都选理,则获得100+110+1000的喜悦值。
【数据规模】
对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数
对于原图中所有相邻的两个人A,B,我们建边:(S源,T汇)
S->A:文A+文AB/2
S->B:文B+文AB/2
A->T:理A+理AB/2
B->T:理B+理AB/2
A<–>B:文AB/2+理AB/2
但是,为了保持精度准确,我们先建图时所有边*2,最后ans再/2.
ISAP!
#include<iostream>
#include<fstream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<deque>
#include<utility>
#include<map>
#include<set>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<functional>
#include<sstream>
#include<cstring>
#include<bitset>
#include<stack>
using namespace std; int n,m,s,t,cnt,x,y,z,sum;
struct sdt
{
int cap,flow,u,v;
}e[500005];
int nxt[500005],fir[10005],d[10005],par[10005],num[10005],cur[10005];
int wk[105][105],lk[105][105],kkk[105][105];
bool vis[10005]; int read()
{
int x=0;char c=getchar();
while(c<48||c>57)c=getchar();
while(c>47&&c<58)x*=10,x+=c-48,c=getchar();
return x;
} void add(int x,int y,int z)
{
e[++cnt].u=x;e[cnt].v=y;e[cnt].cap=z;e[cnt].flow=0;
nxt[cnt]=fir[x];fir[x]=cnt;
} void bfs()
{
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
queue<int>q;
d[t]=0;
vis[t]=1;
q.push(t);
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=fir[k];i;i=nxt[i])
{
if(!vis[e[i].v] && e[i].cap==0)
{
vis[e[i].v]=1;
d[e[i].v]=d[k]+1;
q.push(e[i].v);
}
}
}
} int agument()
{
int p=t;
int ans=2147483647;
while(p!=s)
{
ans=min(ans,e[par[p]].cap-e[par[p]].flow);
p=e[par[p]].u;
}
p=t;
while(p!=s)
{
e[par[p]].flow+=ans;
e[par[p]^1].flow-=ans;
p=e[par[p]].u;
}
return ans;
} int isap()
{
memset(num,0,sizeof(num));
int flow=0;
for(int i=1;i<=t;i++)
{
num[d[i]]++;
cur[i]=fir[i];
}
int p=s;
while(d[s]<t)
{
if(p==t)
{
flow+=agument();
p=s;
}
bool ok=0;
for(int i=cur[p];i;i=nxt[i])
{
if(e[i].cap>e[i].flow && d[p]==d[e[i].v]+1)
{
ok=1;
par[e[i].v]=i;
cur[p]=i;
p=e[i].v;
break;
}
}
if(!ok)
{
int mn=t-1;
for(int i=fir[p];i;i=nxt[i])
{
if(e[i].cap>e[i].flow)mn=min(mn,d[e[i].v]);
}
if(--num[d[p]]==0)break;
num[d[p]=mn+1]++;
cur[p]=fir[p];
if(p!=s)p=e[par[p]].u;
}
}
return flow;
} int main()
{
n=read();m=read();;
memset(nxt,0,sizeof(nxt));
memset(fir,0,sizeof(fir));
cnt=1;
s=1;
t=n*m+2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
wk[i][j]=read();
sum+=wk[i][j];
add(s,(i-1)*m+j+1,wk[i][j]*2);
add((i-1)*m+j+1,s,0);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
lk[i][j]=read();
sum+=lk[i][j];
add((i-1)*m+j+1,t,lk[i][j]*2);
add(t,(i-1)*m+j+1,0);
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m;j++)
{
x=read();
sum+=x;
kkk[i][j]=x;
add(s,(i-1)*m+j+1,x);
add((i-1)*m+j+1,s,0);
add(s,i*m+j+1,x);
add(i*m+j+1,s,0);
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m;j++)
{
x=read();
sum+=x;
add((i-1)*m+j+1,t,x);
add(t,(i-1)*m+j+1,0);
add(i*m+j+1,t,x);
add(t,i*m+j+1,0);
add(1+(i-1)*m+j,1+i*m+j,kkk[i][j]+x);
add(1+i*m+j,1+(i-1)*m+j,kkk[i][j]+x);
}
}
memset(kkk,0,sizeof(kkk));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m-1;j++)
{
x=read();
sum+=x;
kkk[i][j]=x;
add(s,(i-1)*m+j+1,x);
add((i-1)*m+j+1,s,0);
add(s,(i-1)*m+j+2,x);
add((i-1)*m+j+2,s,0);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m-1;j++)
{
x=read();
sum+=x;
add((i-1)*m+j+1,t,x);
add(t,(i-1)*m+j+1,0);
add((i-1)*m+j+2,t,x);
add(t,(i-1)*m+j+2,0);
add(1+(i-1)*m+j,(i-1)*m+j+2,kkk[i][j]+x);
add((i-1)*m+j+2,1+(i-1)*m+j,kkk[i][j]+x);
}
}
bfs();
printf("%d\n",sum-isap()/2);
return 0;
}
BZOJ-2127-happiness(最小割)的更多相关文章
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- [置顶] [BZOJ]2127: happiness 最小割
happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...
- BZOJ 2127: happiness(最小割解决集合划分)
Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2350 Solved: 1138[Submit][Status][Discuss] Descript ...
- [BZOJ 2127] happiness 【最小割】
题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...
- BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)
题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...
- [国家集训队]happiness 最小割 BZOJ 2127
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- bzoj 2127 happiness【最小割+dinic】
参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...
- [bzoj2127]happiness——最小割
这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...
- spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】
因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...
- bzoj 2127: happiness
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
随机推荐
- dirname 命令
dirname 命令用途将指定路径除了最后以外的部分写到标准输出.语法dirname Path描述dirname 命令读取指定路径名保留最后一个"/"(斜杠)及其后面的字符,删除其 ...
- 深入理解DOM节点类型第五篇——元素节点Element
× 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...
- JAVA-堆区,栈区,方法区。
转载:http://blog.csdn.net/wangxin1982314/article/details/50293241 堆区: 村线程操纵的数据(对象形式存放) 1 存储的全部是对象,每个对象 ...
- Android数据库相关整理
今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅.主要内容有: 1.原生数据库写法 2.终端进sqlite的操作 3.第三方库 4.事务处理 5.权限和路径 一.原生数据库 ...
- webpack-dev-server轻量级js高速打包、热部署服务器
webpack是一个打包web项目的工具 ,可以实现css,js,less,cass,html的混淆加密,minify,结合webpack-dev-server热部署,非常方便前端页面和Nodejs的 ...
- 会议管理心得记录(非markdown版)
前提 本文说的会议特指有开发团队成员参与的会议, 包括但不限于开发.设计.测试.运维.管理岗位的成员. 因为不同工种和行业都有其特殊性,我是一名程序员,并不太了解其他工种和行业的具体情况,不敢妄言. ...
- although 和 although 的区别
作为连词的时候,although 和 though 是可以互换的.Although 一般被认为更加正式一些.比如,以下的这些句子: Growth in Europe is maintaining mo ...
- Oracle索引重建
一.前言 Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.有人持不同观点,就是强烈建议不要定期重建索引.索引重建是一个争论不休被不断 ...
- mongodb高级应用
一. 高级查询 查询操作符 条件操作符:db.collection.find({"field":{$gt/$lt/$gte/$lte/$eq/$ne:value}}); 匹配所有 ...
- 使用jekins自动构建部署java maven项目(jdk1.7+tomcat7.0+jenkins2.19.3)
1.下载jenkins 地址:https://jenkins.io/index.html 本人下载了2.19.3版本的war包:jenkins.war 2.安装jenkins 拷贝jenkins.wa ...