这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们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. python+matplotlib 绘制等高线

    python+matplotlib 绘制等高线 步骤有七: 有一个m*n维的矩阵(data),其元素的值代表高度 构造两个向量:x(1*n)和y(1*m).这两个向量用来构造网格坐标矩阵(网格坐标矩阵 ...

  2. Makefile中wildcard的介绍

    在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTER ...

  3. (数据科学学习手札35)tensorflow初体验

    一.简介 TensorFlow时谷歌于2015年11月宣布在Github上开源的第二代分布式机器学习系统,目前仍处于快速开发迭代中,有大量的新功能新特性在陆续研发中: TensorFlow既是一个实现 ...

  4. debounce、throttle、requestAnimationFrame

    今天review同事代码,代码实现了返回顶部的功能,用到了lodash库中的throttle,我看着眼生,于是乎去看了下lodash文档,然后牵出了debounce,具体的知识点,这里不再赘述,底部的 ...

  5. 13 ThreadLocal

    ThreadLocal 在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 1. 使用函数 ...

  6. P1189 SEARCH(逃跑的拉尔夫)

    P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...

  7. php杂记——1(基础知识与文件读写)

    1.变量前面需要加美元符号"$",常量则不需要: define('PRICE',100); echo PRICE; 2.用一个变量的值作为另一个变量的名称可以得到类似C中的指针变量 ...

  8. html5特效库

    Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. delaunay.js是一款能在图片中形成无数个三角形 ...

  9. Unity动态换装之Spine换装

    注:转载请注明转载,并附原链接 http://www.cnblogs.com/liaoguipeng/p/5867510.html 燕双飞情侣 一.动态换装原理 换装,无非就是对模型的网格,或者贴图进 ...

  10. 21天学习caffe(二)

    本文大致记录使用caffe的一次完整流程 Process 1 下载mnist数据集(数据量很小),解压放在data/mnist文件夹中:2 运行create_mnist.sh,生成lmdb格式的数据( ...