BZOJ 2127 happiness ——网络流
【题目分析】
基本上是第一次真正的使用最小割的模型。
同时加上一个数然后最后再减去是处理负数的一种方法。
设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解。
这道题目,把收益取反,最小流就是最大的收益了。
需要好好思考
【代码】
#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 ——网络流的更多相关文章
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- [BZOJ 2127] happiness 【最小割】
题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...
- bzoj——2127: happiness
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2570 Solved: 1242[Submit][Status][D ...
- [置顶] [BZOJ]2127: happiness 最小割
happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...
- bzoj 2127: happiness
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
- bzoj 2127 happiness【最小割+dinic】
参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...
- BZOJ 2127: happiness(最小割解决集合划分)
Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2350 Solved: 1138[Submit][Status][Discuss] Descript ...
- BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)
题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...
- [国家集训队]happiness 最小割 BZOJ 2127
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
随机推荐
- 实用IMX6开发板来袭, 方便开发板方便你
这是迅为电子推出的一款IMX6Q开发板是Freescale Cortex-a9四核处理器,采用底板加核心板形式,稳定耐用,拆卸非常的方便,同一底板兼容四种核心板,分别为四核商业级,四核工业级,双核商业 ...
- JSON数组不用字符串转换的写法
var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...
- kitti raw data development kit的使用
run_demoVelodyne.m使用:http://blog.csdn.net/qq_33801763/article/details/78959205 https://www.cnblogs ...
- 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, ...
- CPP-网络/通信:SOCKET
客户端实现代码: //引入头文件 #include <WinSock2.h> //客户端创建Socket////////////////////////////////////////// ...
- PDO drivers no value 解决办法
我的服务器是windos系统的,而且我也已经开启了PDO扩展,但是查看phpinfo的时候,结果却如下图: 解决办法 修改 php.ini 中的 extension_dir 路径即可! 将extens ...
- JAVA web项目转客户端(nativefier)
1.环境:windows 2.下载node.js 3.安装mode.js;记住安装目录 4.命令行进入安装目录 5.执行语句: npm install nativefier –g 进行安装 6.新建空 ...
- 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必 ...
- ios之UISplitViewController
iPad的屏幕比iPhone大,所以在界面上,iPad比iPhone多一个UISplitViewController,用来实现iPad在横屏时,分两栏显示所需要的界面,可以一边是目录一边是具体的内容. ...
- hihoCoder-1097-Prim
这题就是prim的板子题,不过如果用end每次初始化为-1的话,我们就不需要对于每次选中的下一个点进行判断是否选中了,因为每次外层循环第一次进入都是可以的. 然后还很 (i=1:i<=n;i++ ...