这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们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. 微信小程序中无刷新修改

    1.点击事件无刷新修改 原理:onload事件中是把这个分类和品牌的列表全部拿出来,拼接成数组的格式,在小程序中遍历的时候就要把小标(index)给绑定到左侧的品牌上,然后js中获取index的值,就 ...

  2. MAC和windows开发操作系统环境,解决Maven工程中报 Missing artifact jdk.tools:jdk.tools

    同事使用的是苹果mac,而我们其他人的开发环境是windows jdk1.8 导致同事从git上pull下来的工程,pom文件是直接报错的, windows下的pom文件设置是这样的: <dep ...

  3. C语言Windows程序开发—CreateWindow函数介绍【第03天】

    (一)CreateWindow函数的参数介绍: HWND CreateWindow( LPCTSTR lpClassName, //Windows窗口中预定义的控件结构体,包括:BUTTON(按钮), ...

  4. SocketServer模块中的几种类

    BaseServer:包括服务器的核心功能与混合类的一些功能. TCPServer:基本的网络同步TCP服务器. UDPServer:基本的网络同步UDP服务器. ForkingMixIn:实现了核心 ...

  5. Black And White (DFS 训练题)

    G - Black And White ================================================================================ ...

  6. Java——static关键字---18.09.27

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但在Java语言中没有全局变量的概念. static关键字主要有两种作用: 一.为某特定数据类 ...

  7. VS中的一些标记

    1.//ToDO:此标记运行时会显示在任务列表窗口中.

  8. 关于springboot 连接mysql 数据库报错问题

    springboot连接MySQL运行报错: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more ...

  9. spring读取properties和其他配置文件的几种方式

    1.因为spring容器的一些机制,在读取配置文件进行数据库的配置等等是很有必要的,所以我们要考虑配置文件的的读取方式以及各个方式的实用性 2.配置文件的读取方式我这里介绍2种,目的是掌握这2种就可以 ...

  10. Linux/CentOS防CC攻击脚本

    #!/bin/sh cd /var/log/httpd/ cat access_log|awk > a cp /dev/null access_log cp /dev/null error_lo ...