题目大意:有一个$n\times m$的矩阵,矩阵的每个位置上有一个同学,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。求一个方案,使得全班的喜悦值总和最大。

数据范围:$n,m≤100$,权值$≤5000$。
此题直接最小割,对于一对相邻的同学$(A,B)$,设$L_A$表示$A$同学选理的喜悦值,$W_A$表示$A$同学选文的喜悦值(前面说的两种情况$B$同理),设$L$为两个人都选理的额外收获喜悦值,$W$为两个人都选文的额外收获喜悦值,则有:
$S->A$ ,权值为:$L_A+\frac{1}{2}L$
$A->T$ ,权值为:$W_A+\frac{1}{2}W$
$S->A$ ,权值为:$L_A+\frac{1}{2}L$
$A->T$ ,权值为:$W_A+\frac{1}{2}W$
$A<->B$,权值为:$\frac{1}{2}(L+W)$
当点数变多的时候,情况会有所不同,基于这个思路简单变形下就好了
建完图后跑最大流就行了
B站上的数据比较水,我们OJ上的数据加强了必须加上一个特殊的剪枝才能过(新姿势get)

 #include<bits/stdc++.h>
#define M 300005
#define N 105
#define INF 1145141919
#define F(_x,_y) for(int i=1;i<=(_x);i++) for(int j=1;j<=(_y);j++)
using namespace std; struct edge{int u,v,next;}e[M]={}; int head[M]={},use=;
void add(int x,int y,int z){e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use++;}
void Add(int x,int y,int z){add(x,y,z); add(y,x,);}
int n,m,a[N][N]={},b[N][N]={},sum=,id[N][N]={},d[N][N]={},r[N][N]={},cnt=;
int S,T,vis[M]={}; queue<int> q; bool bfs(){
q.push(S); memset(vis,,(cnt+)<<); vis[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=head[u];~i;i=e[i].next)
if(e[i].v&&vis[e[i].u]==){
vis[e[i].u]=vis[u]+;
q.push(e[i].u);
}
}
return vis[T];
}
int dfs(int x,int flow){
if(x==T) return flow; int sum=;
for(int i=head[x];~i;i=e[i].next)
if(e[i].v&&vis[e[i].u]==vis[x]+){
int k=dfs(e[i].u,min(flow,e[i].v));
e[i].v-=k; e[i^].v+=k;
sum+=k; flow-=k;
if(flow==) return sum;
}
if(sum==) vis[x]=-;
return sum;
}
int dinic(){
int res=;
while(bfs())
res+=dfs(S,INF);
return res;
} int main(){
//freopen("in.txt","r",stdin);
memset(head,-,sizeof(head));
S=; T=; cnt=;
scanf("%d%d",&n,&m);
F(n,m) id[i][j]=++cnt;
F(n,m) scanf("%d",&a[i][j]),sum+=a[i][j],a[i][j]<<=;
F(n,m) scanf("%d",&b[i][j]),sum+=b[i][j],b[i][j]<<=;
F(n-,m){
int x; scanf("%d",&x);
a[i][j]+=x; a[i+][j]+=x; sum+=x; d[i][j]+=x;
}
F(n-,m){
int x; scanf("%d",&x);
b[i][j]+=x; b[i+][j]+=x; sum+=x; d[i][j]+=x;
}
F(n,m-){
int x; scanf("%d",&x);
a[i][j]+=x; a[i][j+]+=x; sum+=x; r[i][j]+=x;
}
F(n,m-){
int x; scanf("%d",&x);
b[i][j]+=x; b[i][j+]+=x; sum+=x; r[i][j]+=x;
}
F(n,m){
Add(S,id[i][j],a[i][j]);
Add(id[i][j],T,b[i][j]);
}
F(n,m-){
add(id[i][j],id[i][j+],r[i][j]);
add(id[i][j+],id[i][j],r[i][j]);
}
F(n-,m){
add(id[i][j],id[i+][j],d[i][j]);
add(id[i+][j],id[i][j],d[i][j]);
}
int hh=dinic();
hh>>=;
cout<<sum-hh<<endl;
}

【BZOJ2127】happiness 最小割的更多相关文章

  1. [bzoj2127]happiness——最小割

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

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

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

  3. [BZOJ2127]happiness-[网络流-最小割]

    Description 传送门 Solution 按照最小割的思路考虑. 根据题意,当两个人都选文(理),需要砍掉两个人都选理(文)的加成:如果两个人选的不一样,就要都砍掉. 这是一个网络流建模的套路 ...

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

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

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

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

  6. luogu P1646 [国家集训队]happiness (最小割)

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

  7. BZOJ 2127: happiness [最小割]

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

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

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

  9. 【BZOJ2127】happiness(最小割)

    [BZOJ2127]happiness(最小割) 题面 Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了, ...

随机推荐

  1. HDFS系列 -- HDFS预研

    1 HDFS概述 由于传统集中式的物理服务器在存储容量和数据传输速度等方面都有限制,故而越来越不符合这些数据的实际存储需要. 在大数据时代,大数据处理需要解决的首要问题是:如何高效地存储所产生的规模庞 ...

  2. Devexpress VCL Build v2013 vol 13.2.4 发布

    不说了,自己看吧. What's New in 13.2.4 (VCL Product Line)   New Major Features in 13.2 What's New in VCL Pro ...

  3. 美团点评2017校招笔试真题-算法工程师A

    美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. map 正确答案: B STL的容器可以分为以下 ...

  4. 2018.10.16 NOIP模拟 膜法(组合数学)

    传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...

  5. win7 精简板 安装ardunio uno r3驱动

    http://www.arduino.cn/thread-2350-1-1.html 下载那个64位的 http://www.keyes-robot.cn/forum.php?mod=viewthre ...

  6. 设定Word段落的背景色

    段落背景不同于文字区别.很多新接触word的朋友都找不到怎么弄. 先把光标停留在需要设置的段落文字上,或者选择需要设置的段落文字. 点击段落里的边框和底纹,如图 在弹出框中选择底纹. 选择需要填充的颜 ...

  7. Tomcat 环境变量配置

    1.变量和常量 i 和 0 2.环境变量 cmd >set 查看所有环境变量 %PATH% 系统指定可执行文件的搜索路径,可以是 .exe .bat String path=“C:\WINDOW ...

  8. RepositionBars的用法和参数的意义(引用别人的)

    MFC窗口位置管理详细分析及实例 在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有WM_CHILD风格的窗口).上边是工具栏,中间是视图窗口,下边是状态栏.三个窗 口在框架的客户区里和 ...

  9. win7 环境安装Python + IDE(vs2010)开发

    1.下载python安装文件 python-2.7.10.msi 网址:https://www.python.org/downloads/release/python-2710/ ,根据自己环境,选择 ...

  10. VS2010编译错误:是否忘记了向源中添加“#include "stdafx.h

    VS2010编译错误:是否忘记了向源中添加“#include "stdafx.h 编译提示:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“# ...