【BZOJ】【2132】圈地计划
网络流/最小割
Orz Hzwer
这类大概是最小割建模中的经典应用吧……
黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了……
- /**************************************************************
- Problem: 2132
- User: Tunix
- Language: C++
- Result: Accepted
- Time:0 ms
- Memory:6252 kb
- ****************************************************************/
- //BZOJ 2132
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- #define rep(i,n) for(int i=0;i<n;++i)
- #define F(i,j,n) for(int i=j;i<=n;++i)
- #define D(i,j,n) for(int i=j;i>=n;--i)
- #define FOR for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
- #define pb push_back
- using namespace std;
- inline int getint(){
- int v=,sign=; char ch=getchar();
- while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
- while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
- return v*sign;
- }
- const int N=,M=,INF=~0u>>;
- const int fx[]={,,-,},
- fy[]={,,,-};
- typedef long long LL;
- /******************tamplate*********************/
- int n,m,a[][],b[][],c[][],color[][],tot,ans;
- struct edge{
- int from,to,v;
- };
- inline int pack(int i,int j){ return (i-)*m+j; }
- struct Net{
- edge E[M];
- int head[N],next[M],cnt;
- bool vis[][];
- void ins(int x,int y,int v){
- E[++cnt]=(edge){x,y,v};
- next[cnt]=head[x]; head[x]=cnt;
- }
- void add(int x,int y,int v){
- ins(x,y,v); ins(y,x,);
- }
- void add2(int x,int y,int v){
- ins(x,y,v); ins(y,x,v);
- }
- int s,t,d[N],Q[N];
- void init(){
- n=getint();m=getint();
- cnt=;tot=ans=;
- s=;t=n*m+;
- int x,y;
- memset(a,-,sizeof a);
- FOR a[i][j]=getint();
- FOR b[i][j]=getint();
- FOR c[i][j]=getint();
- FOR if ((i+j)&) color[i][j]=;
- FOR{
- if (color[i][j]) swap(a[i][j],b[i][j]);
- tot+=a[i][j]+b[i][j];
- add(s,pack(i,j),a[i][j]);
- add(pack(i,j),t,b[i][j]);
- if (color[i][j]) rep(k,){
- int tx=i+fx[k],ty=j+fy[k];
- if (!tx||!ty||tx>n||ty>m) continue;
- add2(pack(i,j),pack(tx,ty),c[i][j]+c[tx][ty]);
- tot+=c[i][j]+c[tx][ty];
- }
- }
- }
- bool mklevel(){
- memset(d,-,sizeof d);
- d[s]=;
- int l=,r=-;
- Q[++r]=s;
- while(l<=r){
- int x=Q[l++];
- for(int i=head[x];i;i=next[i])
- if (d[E[i].to]==- && E[i].v){
- d[E[i].to]=d[x]+;
- Q[++r]=E[i].to;
- }
- }
- return d[t]!=-;
- }
- int dfs(int x,int a){
- if(x==t)return a;
- int flow=;
- for(int i=head[x];i && flow<a;i=next[i])
- if (d[E[i].to]==d[x]+ && E[i].v){
- int f=dfs(E[i].to,min(a-flow,E[i].v));
- E[i].v-=f;
- E[i^].v+=f;
- flow+=f;
- }
- if (!flow) d[x]=-;
- return flow;
- }
- void Dinic(){
- while(mklevel()) ans+=dfs(s,INF);
- }
- }G1;
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("2132.in","r",stdin);
- freopen("2132.out","w",stdout);
- #endif
- G1.init(); G1.Dinic();
- printf("%d\n",tot-ans);
- return ;
- }
2132: 圈地计划
Time Limit: 2 Sec Memory Limit: 256 MB
Submit: 515 Solved: 228
[Submit][Status][Discuss]
Description
最
近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old
Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来
开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,建造商业区将得到Aij收益,建造工
业区将得到Bij收益。另外不同的区域连在一起可以得到额外的收益,即如果区域(I,j)相邻(相邻是指两个格子有公共边)有K块(显然K不超过4)类型
不同于(I,j)的区域,则这块区域能增加k×Cij收益。经过Tiger.S教授的勘察,收益矩阵A,B,C都已经知道了。你能帮GDOI求出一个收益
最大的方案么?
Input
输入第一行为两个整数,分别为正整数
N和M,分别表示区域的行数和列数;第2到N+1列,每行M个整数,表示商业区收益矩阵A;第N+2到2N+1列,每行M个整数,表示工业区收益矩阵B;
第2N+2到3N+1行,每行M个整数,表示相邻额外收益矩阵C。第一行,两个整数,分别是n和m(1≤n,m≤100);
任何数字不超过1000”的限制
Output
输出只有一行,包含一个整数,为最大收益值。
Sample Input
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
1 1 1
1 3 1
1 1 1
Sample Output
【数据规模】
对于100%的数据有N,M≤100
HINT
数据已加强,并重测--2015.5.15
Source
【BZOJ】【2132】圈地计划的更多相关文章
- [BZOJ]2132: 圈地计划 最小割
圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一 ...
- BZOJ 2132 圈地计划(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2132 题意:n*m的格子染色黑白,对于格子(i,j)染黑色则价值为A[i][j],白色为 ...
- bzoj 2132 圈地计划(黑白染色,最小割)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2132 [题意] 给定n*m个区域,建工业区价值A,建商业区价值B,如果(i,j)有k个 ...
- bzoj 2132: 圈地计划
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
- bzoj 2132 圈地计划【最小割+dinic】
对于网格图,尤其是这种要求相邻各自不同的,考虑黑白染色 对于这张染色后图来说: 对于每个黑格: 表示初始时选择商业区: s点向它连商业区收益的流量,它向t点连工业区收益的流量: 割断S侧的边说明反悔, ...
- BZOJ 2131 圈地计划(最小割+黑白染色)
类似于happiness的一道题,容易想到最小割的做法. 但是不同的是那一道题是相邻的如果相同则有收益,这题是相邻的不同才有收益. 转化到建图上面时,会发现,两个相邻的点连的边容量会是负数.. 有一种 ...
- bzoj2132: 圈地计划(无比强大的最小割)
2132: 圈地计划 题目:传送门 简要题意: 给出一个矩阵,一共n*m个点,并给出三个收益矩阵.A矩阵表示这个点建A的可取收益,B矩阵表示这个点建B的可取收益,C矩阵表示如果相邻(有且仅有一条公共边 ...
- 【BZOJ2132】圈地计划(最小割)
[BZOJ2132]圈地计划(最小割) 题面 BZOJ 题解 对我而言,不可做!!! 所以我膜烂了ZSY大佬 他的博客写了怎么做... 这,,...太强啦!! 完全想不到黑白染色之后反着连边 然后强行 ...
- BZOJ 5424: 烧桥计划
BZOJ 5424: 烧桥计划 目前暂居rk1QAQ 首先,设\(f[i][k]\)为前i个点中,选了第i个点,总共选了k个点的答案.那么就有: \[f[i][k]=min_{j<i}\{f[j ...
随机推荐
- window.open和window.showdialog区别
open打开的窗口可以点击切换到其背后的父窗口,dialog的窗口无法点击切换到其背后的父窗口, 假如用window.opener或者parent等对象时,建议用open方法,不要用dialog,否则 ...
- Objective-C 【Category-非正式协议-延展】
------------------------------------------- 类别(Category)的声明和实现 实质:类别又叫类目,它其实是对类的一个拓展!但是他不同于继承后的拓展! ...
- [翻译.每月一译.每日一段]Exploring Fonts with DirectWrite and Modern C++
Windows with C++ Exploring Fonts with DirectWrite and Modern C++ Kenny Kerr DirectWrite is an incred ...
- 【风马一族_Android】Android Studio 给APP设置签名
在Android Studio中,给App签名,如果没有给App设置签名的话,Android Studio会主动给app设置一个默认的签名 接下来,介绍主动给App设置一个签名的整个步骤过程: 1) ...
- Azure + vsftpd + ubntu14 + 虚拟用户 遇到的问题:从网上摘抄
:在Azure安装好ubuntu虚拟机,安装包选择ubuntu14.04 LTS,选择LTS,以便微软对其以后的更好支持,不选就可能技术支持不会很久,现只开一台,端口默认选择22 :打开虚拟机,进入端 ...
- iOS相机操作笔记
最近忙于项目,需要拍摄图片,这里先列出部分测试代码. // // FirstViewController.m // UiTest // // Created by Tang Huaming on 16 ...
- JS获取图片实际宽高及根据图片大小进行自适应
JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ad ...
- LoadRunner报26612错误的解决方案
LoadRunner压力测试时,一直会报12261错误,错误内容大概如下: Error -26612: HTTP Status-Code=500 (Internal Server Error) for ...
- Sandcastle是什么
如果你的项目是.net开发,同时需要生成HTML的方法成员文档时,哪么就不得不拿出Sandcastle 因为Sandcastle是微软开发,并开源的文档生成工具; 这种生成进度等待的感觉很爽! 在这里 ...
- unity--IOC框架资料整理
今天在网上找了一些unity资料研究,出了好多问题,编译无法通过,经人指点总算成功编译运行,做个笔记,整理如下: 一.下载unity: 二.在项目中添加Microsoft.Practices.Unit ...