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 2
1 1
100 110
1
1000

Sample Output

1210
【样例说明】
两人都选理,则获得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(最小割)的更多相关文章

  1. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  2. [置顶] [BZOJ]2127: happiness 最小割

    happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...

  3. BZOJ 2127: happiness(最小割解决集合划分)

    Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2350  Solved: 1138[Submit][Status][Discuss] Descript ...

  4. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  5. BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)

    题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...

  6. [国家集训队]happiness 最小割 BZOJ 2127

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  7. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

  8. [bzoj2127]happiness——最小割

    这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...

  9. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  10. bzoj 2127: happiness

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

随机推荐

  1. jquery的选择器

    一.基本选择器 1.$("#id") id选择器,返回单个元素 2.$(".class") class选择器,返回集合元素 3.$("element& ...

  2. C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝

    原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...

  3. WEB页面中常见的四种控件的必须的测试

    以下为常规的需求,除非需求有明确说明,如密码输入框中可以输入空格.   输入框 1. 为空,但页面中明确说明不能为空(带有星号或者只有这一个输入框),有以下两种情况: a. 不进行输入或者使其为空:焦 ...

  4. Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)

    引导目录: Hibernate 系列教程 目录 本篇导航: 为什么学习框架技术 框架的概念 主流框架的介绍 1.为什么学习框架技术 如何制作一份看上去具有专业水准的PPT文档呢?一个简单的方法就是使用 ...

  5. Node.js 教程 03 - 创建HTTP服务器

    前言: 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请 ...

  6. Yii 开发微信 '您提交的数据无法被验证'

    使用Yii开发微信时,出现 [error][yii\web\HttpException:] exception 'yii\web\BadRequestHttpException' with messa ...

  7. 在使用EF时调用DBFUNCTION扩展方法时,发生ENTITYCOMMANDEXECUTIONEXCEPTION 异常的解决办法

    System.Data.Entity.Core.EntityCommandExecutionException : An error occurred while executing the comm ...

  8. protobuf学习(2)-相关学习资料

    protobuf官方git地址 protobuf官方英文文档   (你懂的需要FQ) protobuf中文翻译文档 protobuf概述          (官方翻译 推荐阅读) protobuf入门 ...

  9. Java 加解密技术系列文章

    Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...

  10. JAVA操作LDAP的详解(JLDAP)

    最近两周由于要学习测试LDAP,所以对于用脚本操作LDAP很感兴趣,所以就做了一些脚本,都是比较简单的脚本吧. 废话不多说了哈.直接上教程 首先声明:我使用的是JLDAP操作LDAP,所以需要从官网下 ...