网络流/最小割


  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

3 3
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

81
【数据规模】
对于100%的数据有N,M≤100

HINT

数据已加强,并重测--2015.5.15

Source

[Submit][Status][Discuss]

【BZOJ】【2132】圈地计划的更多相关文章

  1. [BZOJ]2132: 圈地计划 最小割

    圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一 ...

  2. BZOJ 2132 圈地计划(最小割)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2132 题意:n*m的格子染色黑白,对于格子(i,j)染黑色则价值为A[i][j],白色为 ...

  3. bzoj 2132 圈地计划(黑白染色,最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2132 [题意] 给定n*m个区域,建工业区价值A,建商业区价值B,如果(i,j)有k个 ...

  4. bzoj 2132: 圈地计划

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

  5. bzoj 2132 圈地计划【最小割+dinic】

    对于网格图,尤其是这种要求相邻各自不同的,考虑黑白染色 对于这张染色后图来说: 对于每个黑格: 表示初始时选择商业区: s点向它连商业区收益的流量,它向t点连工业区收益的流量: 割断S侧的边说明反悔, ...

  6. BZOJ 2131 圈地计划(最小割+黑白染色)

    类似于happiness的一道题,容易想到最小割的做法. 但是不同的是那一道题是相邻的如果相同则有收益,这题是相邻的不同才有收益. 转化到建图上面时,会发现,两个相邻的点连的边容量会是负数.. 有一种 ...

  7. bzoj2132: 圈地计划(无比强大的最小割)

    2132: 圈地计划 题目:传送门 简要题意: 给出一个矩阵,一共n*m个点,并给出三个收益矩阵.A矩阵表示这个点建A的可取收益,B矩阵表示这个点建B的可取收益,C矩阵表示如果相邻(有且仅有一条公共边 ...

  8. 【BZOJ2132】圈地计划(最小割)

    [BZOJ2132]圈地计划(最小割) 题面 BZOJ 题解 对我而言,不可做!!! 所以我膜烂了ZSY大佬 他的博客写了怎么做... 这,,...太强啦!! 完全想不到黑白染色之后反着连边 然后强行 ...

  9. BZOJ 5424: 烧桥计划

    BZOJ 5424: 烧桥计划 目前暂居rk1QAQ 首先,设\(f[i][k]\)为前i个点中,选了第i个点,总共选了k个点的答案.那么就有: \[f[i][k]=min_{j<i}\{f[j ...

随机推荐

  1. Today’s dictation

    A united nations expert on human rights in north korea has warned that the country's dictator, kim j ...

  2. OC6_代理的基本概念

    // // Person.h // OC6_代理的基本概念 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhang ...

  3. jQuery骨架

    jQuery选择器 jQuery操作DOM jQuery中的事件与应用 jQuery的动画与特效 Ajax在jQuery中的应用 jQuery常用插件 jQuery UI插件 jQuery实用工具函数 ...

  4. JDBC连接MySQL数据库及示例

      JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一 ...

  5. mysql之触发器before和after的区别(2)

    我们先做个测试: 接上篇日志建的商品表g和订单表o和触发器 假设:假设商品表有商品1,数量是10: 我们往订单表插入一条记录: insert into o(gid,much) values(1,20) ...

  6. c++学习——类成员的访问权限

    成员的访问权限 Public: 任何人,尤其是那些要使用这个类库的客户程序员,都能访问那个紧跟在public 后面声明的成员. 默认的package: 在同一个目录里面的文件,并且都没有明确指明它是属 ...

  7. C++ 11 之Lambda

    1.Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略. 定义在与 lambda ...

  8. unity 3消 游戏

    3消游戏跟着智能手机流行到现在已经有很长一段时间,unity实现的3消 https://github.com/textcube/match3action 截图如下: 在阅读源码的时候不难发现,Game ...

  9. Infobright高性能数据仓库

    1.  概述 Infobright是一款基于独特的专利知识网格技术的列式数据库.Infobright简单易用,快速安装部署,使用中无需复杂操作,能大幅度减少管理工作:在应对50TB甚至更多数据量进行多 ...

  10. HDFS基本知识整理

    设计理念:         1.超大文件         2.流式数据访问         3.商用普通硬件 不适合场景:         1.低时间延迟的数据访问         2.大量的小文件 ...