【题目分析】

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

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

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

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

需要好好思考

【代码】

#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. 实用IMX6开发板来袭, 方便开发板方便你

    这是迅为电子推出的一款IMX6Q开发板是Freescale Cortex-a9四核处理器,采用底板加核心板形式,稳定耐用,拆卸非常的方便,同一底板兼容四种核心板,分别为四核商业级,四核工业级,双核商业 ...

  2. JSON数组不用字符串转换的写法

    var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...

  3. kitti raw data development kit的使用

    run_demoVelodyne.m使用:http://blog.csdn.net/qq_33801763/article/details/78959205   https://www.cnblogs ...

  4. python_109_切片补充和list函数

    #切片补充 a=[1,2,3,4,5,6,7,8] print(a[::2])#隔一个取一个元素 [1, 3, 5, 7] print(a[::-1])#将列表或元祖颠倒过来 [8, 7, 6, 5, ...

  5. CPP-网络/通信:SOCKET

    客户端实现代码: //引入头文件 #include <WinSock2.h> //客户端创建Socket////////////////////////////////////////// ...

  6. PDO drivers no value 解决办法

    我的服务器是windos系统的,而且我也已经开启了PDO扩展,但是查看phpinfo的时候,结果却如下图: 解决办法 修改 php.ini 中的 extension_dir 路径即可! 将extens ...

  7. JAVA web项目转客户端(nativefier)

    1.环境:windows 2.下载node.js 3.安装mode.js;记住安装目录 4.命令行进入安装目录 5.执行语句: npm install nativefier –g 进行安装 6.新建空 ...

  8. 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link

    Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必 ...

  9. ios之UISplitViewController

    iPad的屏幕比iPhone大,所以在界面上,iPad比iPhone多一个UISplitViewController,用来实现iPad在横屏时,分两栏显示所需要的界面,可以一边是目录一边是具体的内容. ...

  10. hihoCoder-1097-Prim

    这题就是prim的板子题,不过如果用end每次初始化为-1的话,我们就不需要对于每次选中的下一个点进行判断是否选中了,因为每次外层循环第一次进入都是可以的. 然后还很 (i=1:i<=n;i++ ...