【题目分析】

基本上是第一次真正的使用最小割的模型。

同时加上一个数然后最后再减去是处理负数的一种方法。

设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解。

这道题目,把收益取反,最小流就是最大的收益了。

需要好好思考

【代码】

#include <cstdio>
#include <cstring>
//#include <cmath>
//#include <cstdlib> //#include <map>
//#include <set>
#include <queue>
//#include <string>
//#include <iostream>
//#include <algorithm> using namespace std; #define maxn 105
#define maxn2 105*105
#define me 800005
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i) void Finout()
{
#ifndef ONLINE_JUDGE
freopen("nt2011_happiness.in","r",stdin);
freopen("nt2011_happiness.out","w",stdout);
#endif
} int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int h[me<<1],to[me<<1],ne[me<<1],fl[me<<1],en=0,cnt=0,S=0,T,x; void add(int a,int b,int c)
{to[en]=b; ne[en]=h[a]; fl[en]=c; h[a]=en++;} int map[maxn*maxn]; bool tell()
{
queue <int> q;
memset(map,-1,sizeof map);
map[S]=0;
while (!q.empty()) q.pop();
q.push(S);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=h[x];i>=0;i=ne[i])
{
if (map[to[i]]==-1&&fl[i]>0)
{
map[to[i]]=map[x]+1;
q.push(to[i]);
}
}
}
if (map[T]!=-1) return true;
return false;
} int zeng(int k,int r)
{
if (k==T) return r;
int ret=0;
for (int i=h[k];i>=0&&ret<r;i=ne[i])
if (map[to[i]]==map[k]+1&&fl[i]>0)
{
int tmp=zeng(to[i],min(fl[i],r-ret));
ret+=tmp; fl[i]-=tmp; fl[i^1]+=tmp;
}
if (!ret) map[k]=-1;
return ret;
} int n,m,hash[maxn][maxn],ws[maxn2];
int wt[maxn2],all=0; int main()
{
memset(h,-1,sizeof h);
Finout();
n=Getint(); m=Getint();
F(i,1,n) F(j,1,m) hash[i][j]=++cnt;
// F(i,1,n)
// {
// F(j,1,m) printf("%d ",hash[i][j]);
// printf("\n");
// }
T=++cnt;
F(i,1,n) F(j,1,m)
{
x=Getint();
all+=x;
wt[hash[i][j]]+=2*x;
}
F(i,1,n) F(j,1,m)
{
x=Getint();
all+=x;
ws[hash[i][j]]+=2*x;
}
F(i,1,n-1) F(j,1,m)
{
x=Getint();
all+=x;
wt[hash[i][j]]+=x;
wt[hash[i+1][j]]+=x;
add(hash[i][j],hash[i+1][j],x);
add(hash[i+1][j],hash[i][j],x);
}
F(i,1,n-1) F(j,1,m)
{
x=Getint();
all+=x;
ws[hash[i][j]]+=x;
ws[hash[i+1][j]]+=x;
add(hash[i][j],hash[i+1][j],x);
add(hash[i+1][j],hash[i][j],x);
}
F(i,1,n) F(j,1,m-1)
{
x=Getint();
all+=x;
wt[hash[i][j]]+=x;
wt[hash[i][j+1]]+=x;
add(hash[i][j],hash[i][j+1],x);
add(hash[i][j+1],hash[i][j],x);
}
F(i,1,n) F(j,1,m-1)
{
x=Getint();
all+=x;
ws[hash[i][j]]+=x;
ws[hash[i][j+1]]+=x;
add(hash[i][j],hash[i][j+1],x);
add(hash[i][j+1],hash[i][j],x);
}
// printf("over!\n");
F(i,1,n) F(j,1,m)
{
add(S,hash[i][j],ws[hash[i][j]]);
add(hash[i][j],S,0);
add(hash[i][j],T,wt[hash[i][j]]);
add(T,hash[i][j],0);
}
int ans=0,tmp;
while (tell()) while (tmp=zeng(S,inf)) ans+=tmp;
printf("%d\n",all-ans/2);
}

  

BZOJ 2127 happiness ——网络流的更多相关文章

  1. BZOJ 2127: happiness [最小割]

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

  2. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  3. bzoj——2127: happiness

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2570  Solved: 1242[Submit][Status][D ...

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

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

  5. bzoj 2127: happiness

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  6. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

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

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

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

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

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

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

随机推荐

  1. C# 操作字符串,在某些特定的字符后面或前面添加其它字符

    C# 操作字符串,在某些特定的字符后面或前面添加其它字符,解决方法: 字符串替换或正则表达式替换即可. 示例:实现的是在每个“第”前面添加一个逗号,在每个“方案”后面添加一个冒号. string s ...

  2. 校内选拔I题题解 构造题 Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) ——D

    http://codeforces.com/contest/574/problem/D Bear and Blocks time limit per test 1 second memory limi ...

  3. 线段树成段更新模板POJ3468 zkw以及lazy思想

    别人树状数组跑几百毫秒 我跑 2500多 #include<cstdio> #include<map> //#include<bits/stdc++.h> #inc ...

  4. NSCopying协议和copy方法

    不是所有的对象都支持 copy需要继承NSCopying 协议(实现 copyWithZone: 方法)同样,需要继承NSMutableCopying 协议才可以使用mutableCopy(实现 mu ...

  5. 用valgrind检查内存问题

    Valgrind Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等. Valgrind工具包包含多个工具,如Memcheck,Cac ...

  6. mac文件夹怎么重命名?苹果电脑文件夹重命名快捷键

    windows系统下给文件夹重命名相信很多朋友都很熟悉,那么Mac OS系统怎么给文件重命名呢,相信很多刚刚入手Mac OS系统的亲们都会有次疑问,下面小编告诉你Mac OS系统的文件夹到底要怎样才能 ...

  7. MFC:AfxParseURL

    BOOL AFXAPI AfxParseURL(     LPCTSTR pstrURL,     DWORD& dwServiceType,     CString& strServ ...

  8. graphviz layer 教程(非布局)

    官方 pdf 上讲解的很少,没有图片. http://www.graphviz.org/wiki/how-use-drawing-layers-overlays 这里有图片,但是又没有说如何生成. 直 ...

  9. iOS 常用尺寸

    APP ICON: @1x:57*57 @2x:114*114 @3x:171*171  机型 屏幕尺寸   像素(px)pixel  点(pt)point    PPI iphone4s 3.5吋  ...

  10. iBeacon技术

    声明:部分资料来源自互联网 前言 iBeacon 最早推出是在今年的苹果 WWDC 大会上.作为 iOS 7 的一部分,它吸引人的一点是,iBeacon 是一种开发标准——绝大多数智能手机支持蓝牙 4 ...