这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们S表示文T表示理,中间一排点是每个人,每个人向两边连其选文或者选理的价值,中间每两个点之间连他们的高兴度,然后我们就要分析,并作出改变,对于任意两个点我们要么割一个z要么两边某一边全割掉,那么我们割两边时不经舍弃了其选理(文)的价值还舍弃了他们一起的价值,对于z我们不仅要割掉了一文一理,而且还把所有的一起全部舍弃因此,于是理(文)边还要带一半的一起,中间的边为双向都为两个(半一起)。

#include <cstdio>
#include <cstring>
#include <iostream>
#define N 2005
#define r register
using namespace std;
inline int read()
{
r int sum=;
r char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct VIA
{
int to,next,f;
}c[N*N*];
int head[N*N],t=;
int like[N][N][];
int n,m,S,T;
int together1[N][N],together2[N][N];
int Hash[N][N];
inline void add(int x,int y,int z)
{
c[++t].to=y;
c[t].f=z;
c[t].next=head[x];
head[x]=t;
}
int q[N*N],top,tail,deep[N*N];
inline bool bfs()
{
memset(deep,,sizeof(deep));
q[]=S;
deep[S]=;
top=tail=;
while(top<=tail)
{
r int x=q[top++];
if(x==T)return ;
for(int i=head[x];i;i=c[i].next)
if(c[i].f&&deep[c[i].to]==)
{
deep[c[i].to]=deep[x]+;
q[++tail]=c[i].to;
}
}
return ;
}
inline int Min(int x,int y)
{
return x<y?x:y;
}
int dfs(int x,int v)
{
if(x==T||!v)return v;
r int ret=;
for(int i=head[x];i;i=c[i].next)
if(c[i].f&&deep[c[i].to]==deep[x]+)
{
r int f=Min(c[i].f,v);
r int w=dfs(c[i].to,f);
v-=w;
ret+=w;
c[i].f-=w;
c[i^].f+=w;
if(!v)break;
}
if(!ret)deep[x]=-;
return ret;
}
inline int dinic()
{
r int ans=;
while(bfs())ans+=dfs(S,0x7f7f7f7f);
return ans;
}
int main()
{
freopen("nt2011_happiness.in","r",stdin);
freopen("nt2011_happiness.out","w",stdout);
r int ans=;
n=read(),m=read();
S=n*m+;
T=S+;
for(r int i=;i<=n;++i)
for(r int j=;j<=m;++j)
like[i][j][]=*read(),ans+=like[i][j][];
for(r int i=;i<=n;++i)
for(r int j=;j<=m;++j)
like[i][j][]=*read(),ans+=like[i][j][];
for(r int i=,x;i<n;++i)
for(r int j=;j<=m;++j)
x=read(),together1[i][j]=x,like[i][j][]+=x,like[i+][j][]+=x,ans+=x*;
for(r int i=,x;i<n;++i)
for(r int j=;j<=m;++j)
x=read(),together1[i][j]+=x,like[i][j][]+=x,like[i+][j][]+=x,ans+=x*;
for(r int i=,x;i<=n;++i)
for(r int j=;j<m;++j)
x=read(),together2[i][j]=x,like[i][j][]+=x,like[i][j+][]+=x,ans+=x*;
for(r int i=,x;i<=n;++i)
for(r int j=;j<m;++j)
x=read(),together2[i][j]+=x,like[i][j][]+=x,like[i][j+][]+=x,ans+=x*;
for(r int i=;i<=n;++i)
for(r int j=;j<=m;++j)
Hash[i][j]=(i-)*m+j,add(S,Hash[i][j],like[i][j][]),add(Hash[i][j],S,),add(Hash[i][j],T,like[i][j][]),add(T,Hash[i][j],);
for(r int i=;i<n;++i)
for(r int j=;j<=m;++j)
add(Hash[i][j],Hash[i+][j],together1[i][j]),add(Hash[i+][j],Hash[i][j],together1[i][j]);
for(r int i=;i<=n;++i)
for(r int j=;j<m;++j)
add(Hash[i][j],Hash[i][j+],together2[i][j]),add(Hash[i][j+],Hash[i][j],together2[i][j]);
ans-=dinic();
ans/=;
printf("%d",ans);
}

【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割的更多相关文章

  1. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  2. BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割

    BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作 ...

  3. BZOJ 2150 cogs 1861 [国家集训队2011]部落战争

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...

  4. 【BZOJ 2039】 2039: [2009国家集训队]employ人员雇佣 (最小割)

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1511  Solved: 728 Descri ...

  5. [国家集训队2011]happiness

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

  6. bzoj2039: [2009国家集训队]employ人员雇佣(最小割)

    传送门 膜一下大佬->这里 不难看出这是一个最小割的模型(然而我看不出来) 我们从源点向每一个点连边,容量为他能带来的总收益(也就是他能对其他所有经理产生的贡献) 然后从每一个点向汇点连边,容量 ...

  7. bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】

    一开始在https://www.cnblogs.com/lokiii/p/10770919.html基础上连(i,j,b[i][j])建了个极丑的图T掉了--把dinic换成isap勉强能卡过 首先因 ...

  8. BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2039 题意:中文题意. 思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那 ...

  9. AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867

    [国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...

随机推荐

  1. unity独立游戏开发日记2018/09/27

    今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...

  2. Linux中程序的编译和链接过程

    1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...

  3. Android面试收集录 对话框、信息提示和菜单

    1.如何使用AlertDialog显示一个列表? 使用AlertDialog.Builder.setItems方法. 在setItems中定义DialogInterface.OnClickListen ...

  4. 洛谷P2307 迷宫

    怎么又是一道叫迷宫的题呀QWQ 题目链接 这道题主要是对并查集的考察,需要注意的坑点在于有可能存在的不止一个联通块. 我们只需要对输入的两个数据进行判断,如果在一个集合中证明有多条路则输出0,如果不在 ...

  5. Spring+quartz cron表达式(cron手册官方)完美理解

    ------------------------------------- 15 17/1 14/3 * * ? 从每小时的17分15秒开始 每分钟的15秒执行一次14:17:15 ...14:59: ...

  6. thrift安装

    yum -y install gcc-c++ autoconf automake sysconftool boost boost-devel libtool perl-ExtUtils-MakeMak ...

  7. Oracle 学习笔记(四)

    ​oracle表查询 使用逻辑操作符号  查询工资高于 500 或者是岗位为 MANAGER 的雇员,同时还要满足他们的姓名首字母为大写 J SELECT * FROM emp WHERE (sal ...

  8. Appium如何获取appPackage和appActivity

    基本概念: appPackage:简单来说是App开发者提供的名称. appActivity:简单来说是App提供的各种不同的功能.每个程序都有个MainActivity,就是打开程序时显示在屏幕的活 ...

  9. python接口测试(二)——配置文件的使用

    在接口测试中,有些东西是固定不变的,比如url,若想更改的话就必须每个请求都更改,因此,可以放到配置文件中使用. 1.创建一个.ini的配置文件,如图: 2.读取配件文件中的内容,后续进行引用 #co ...

  10. webpack使用时可能出现的问题

    1.在配置完webpack.config.js准备进行热加载开发时,修改React内容浏览器不会自动局部刷新,而且会console出一些提示: The following modules couldn ...