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的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
随机推荐
- Monkey安装和使用介绍
安装步骤1)安装sdk环境在系统环境变量中配置 ANDROID_HOMED:\sdk PATH%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%A ...
- Android学习总结(三)——IntentService的用法
一.IntentService的基本概念 IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentServi ...
- UIButton Making the hit area larger
http://stackoverflow.com/questions/808503/uibutton-making-the-hit-area-larger-than-the-default-hit-a ...
- HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
HtmlUnit官网的介绍: HtmlUnit是一款基于Java的没有图形界面的浏览器程序.它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充 ...
- 基于Python的Web应用开发实战——2 程序的基本结构
2.1 初始化 所有Flaks程序都必须创建一个程序实例. Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所 ...
- postman使用--构建工作流和newman
构建工作流 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个 ...
- pseudogene|鉴定功能基因|expressed se|quence tag
基因 (鉴定DNA:可以直接利用DNA序列鉴别基因,但存在3个问题) 1.intron太长(使用用来连接的算法不可及) 2.因为通常功能基因的第一个oxen中有非编码区和启动子最后一个oxen中有终止 ...
- C# 文件操作的工具类
using System.IO; namespace 文件操作类 { public class FileHelper { /// <summary> /// 判断文件是否存在 /// &l ...
- iOS 第三方类库之MBProgressHUD
github链接地址 MBProgressHUD是一个开源的第三方类库实现了很多种样式的提示框,类似Activity indicator,使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大, ...
- js 一维数组转成tree 对象
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...