【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割
这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们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(吴确) 最小割的更多相关文章
- cogs 1901. [国家集训队2011]数颜色
Cogs 1901. [国家集训队2011]数颜色 ★★★ 输入文件:nt2011_color.in 输出文件:nt2011_color.out 简单对比时间限制:0.6 s 内存限制 ...
- BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割
BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作 ...
- BZOJ 2150 cogs 1861 [国家集训队2011]部落战争
题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...
- 【BZOJ 2039】 2039: [2009国家集训队]employ人员雇佣 (最小割)
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1511 Solved: 728 Descri ...
- [国家集训队2011]happiness
Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友 ...
- bzoj2039: [2009国家集训队]employ人员雇佣(最小割)
传送门 膜一下大佬->这里 不难看出这是一个最小割的模型(然而我看不出来) 我们从源点向每一个点连边,容量为他能带来的总收益(也就是他能对其他所有经理产生的贡献) 然后从每一个点向汇点连边,容量 ...
- bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】
一开始在https://www.cnblogs.com/lokiii/p/10770919.html基础上连(i,j,b[i][j])建了个极丑的图T掉了--把dinic换成isap勉强能卡过 首先因 ...
- BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=2039 题意:中文题意. 思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那 ...
- AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
[国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...
随机推荐
- dotnet core 项目
项目 常用命令 我们使用dotnet core 命令行来创建项目及进行编译,发布等,比较常用的dotnet core 命令 如下: dotnet new [arguments] [options] 创 ...
- python 字符串输入、输出函数print input raw_input
一.输出print print输出是以不带引号的输出.(用户所见的输出) 二.input() 和 raw_input()输入函数 raw_input()会把输入数据转换成字符串形式: ------ ...
- Java基础——内部类
一.什么是内部类 将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类 内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$In ...
- JSON初体验(一):JsonObject解析
在学校的呆了一段时间,马上又要回去工作了,不说了,我现在介绍一下json相关的内容 1.JSON数据格式(总的来说,json就是一个字符串) 1.整体结构 String json1 = "{ ...
- 暗影精灵3安装无线网卡驱动(ubuntu16.04)
干货,无线网卡安装步骤: 1. 由于暗影精灵3的无线网卡较新,版本为Realtek Device b822,(查看命令为lspci | grep -i net,Ethernet controller代 ...
- 数据迁移的应用场景与解决方案Hamal
本文来自网易云社区 作者:马进 跑男热播,作为兄弟团忠实粉丝,笔者也是一到周五就如打鸡血乐不思蜀. 看着银幕中一众演员搞怪搞笑的浮夸演技,也时常感慨,这样一部看似简单真情流露的真人秀,必然饱含了许许多 ...
- Python 3基础教程24-读取csv文件
本文来介绍用Python读取csv文件.什么是csv(Comma-Separated Values),也叫逗号分割值,如果你安装了excel,默认会用excel打开csv文件. 1. 我们先制作一个c ...
- Appium如何获取appPackage和appActivity
基本概念: appPackage:简单来说是App开发者提供的名称. appActivity:简单来说是App提供的各种不同的功能.每个程序都有个MainActivity,就是打开程序时显示在屏幕的活 ...
- 配置SSH无密钥登陆(三)
配置SSH无密钥登陆 (1).关闭防火墙 对每个虚拟机进行如下操作: su chkconfig iptables off 执行之后重启虚拟机:reboot (2).关闭之后,在maste ...
- Android基本组件
①Activity和View负责与用户交互 ②Service通常位于后台,拥有独立的生命周期,为其他组件提供后台服务和监控其他组件运行状态 ③BroadcastReceiver广播消息接收器,类似事件 ...