bzoj2132 圈地计划

来源:互联网 发布:指南针炒股软件评价 编辑:程序博客网 时间:2024/04/28 14:44

(http://www.elijahqi.win/2017/12/25/bzoj2132-%E5%9C%88%E5%9C%B0%E8%AE%A1%E5%88%92/)
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

首先根据棋盘黑白染色 然后划分成二分图 然后如果是白色则放左边 从源点向这个点连工业和商业的边 然后 从这个点再向黑点连 如果他们不同的边 然后再从黑点向汇点连 他到底是商业还是工业 这样的话割去两边表示失去了 这个点为工业 或者商业的价值 如果割去中间的点 表示 他们相同 不可以获得c矩阵的奖励

#include<queue>#include<cstdio>#include<cstring>#include<algorithm>#define inf 0x3f3f3f3f#define N 11000using namespace std;inline char gc(){    static char now[1<<16],*S,*T;    if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}    return *S++;}inline int read(){    int x=0;char ch=gc();    while(ch<'0'||ch>'9') ch=gc();    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=gc();}    return x;}int num=1,dx[]={0,1,-1,0},dy[]={1,0,0,-1},level[N],id[110][110],mp[110][110],h[N],T,n,m;struct node{    int y,z,next;}data[120000];inline void insert1(int x,int y,int z){    data[++num].y=y;data[num].z=z;data[num].next=h[x];h[x]=num;    data[++num].y=x;data[num].z=0;data[num].next=h[y];h[y]=num;}inline bool bfs(){    memset(level,0,sizeof(level));queue<int>q;level[0]=1;q.push(0);    while(!q.empty()){        int x=q.front();q.pop();        for (int i=h[x];i;i=data[i].next){            int y=data[i].y,z=data[i].z;            if (level[y]||!z) continue;level[y]=level[x]+1;q.push(y);if (y==T) return 1;        }    }return 0;}inline int dfs(int x,int s){    if (x==T) return s;int ss=s;    for (int i=h[x];i;i=data[i].next){        int y=data[i].y,z=data[i].z;        if (level[x]+1==level[y]&&z){            int xx=dfs(y,min(z,s));if (!xx) level[y]=0;s-=xx;            data[i].z-=xx;data[i^1].z+=xx;if (!s) return ss;        }    }return ss-s;} int main(){    freopen("bzoj2132.in","r",stdin);    n=read();m=read();int tot=0;T=n*m+1;    for (int i=1;i<=n;++i)        for (int j=1;j<=m;++j) id[i][j]=++tot;tot=0;    for (int i=1;i<=n;++i)        for (int j=1;j<=m;++j) {int tmp=read();if (i+j&1) insert1(id[i][j],T,tmp);else insert1(0,id[i][j],tmp);tot+=tmp;}    for (int i=1;i<=n;++i)        for (int j=1;j<=m;++j) {int tmp=read();if (i+j&1) insert1(0,id[i][j],tmp);else insert1(id[i][j],T,tmp);tot+=tmp;}    for (int i=1;i<=n;++i)        for (int j=1;j<=m;++j) mp[i][j]=read();    for (int i=1;i<=n;++i){        for (int j=1;j<=m;++j){            if ((i+j)&1)continue;            for (int k=0;k<4;++k){                int x1=i+dx[k],y1=j+dy[k];                if (x1<1||x1>n||y1<1||y1>m) continue;insert1(id[i][j],id[x1][y1],mp[i][j]+mp[x1][y1]);                insert1(id[x1][y1],id[i][j],mp[i][j]+mp[x1][y1]);tot+=mp[i][j]+mp[x1][y1];            }        }    }int ans=0;while(bfs()) ans+=dfs(0,inf);    printf("%d",tot-ans);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 物流公司损坏了怎么办 白色充电器线脏了怎么办 卷尺缩不回去怎么办 在昆山怎么办电瓶车牌 网购遇到质量问题怎么办 洗衣机外壳坏了怎么办 8元飞享套餐下线怎么办 改光纤后传真机怎么办 网上预约迟到了怎么办 国地税合并局长怎么办? 信用卡申请条件不足怎么办 深户落亲戚房产怎么办准迁证 从深圳迁出户口怎么办 快递未送达签收怎么办 床垫用水洗后怎么办 轿车空调不制冷怎么办 空调氟漏完了怎么办 一窗式比对异常怎么办 高铁票无座怎么办 公司把社保断交怎么办 电信宽带电视无信号怎么办 电信电视没信号怎么办 苹果键盘进水了怎么办 电信怎么办日流量包 济南华强坑人怎么办 超市提货券过期怎么办 深圳天虹怎么办会员卡 超市会员卡丢了怎么办 spa办卡被骗怎么办 契税单据丢了怎么办 qq解冻申请失败怎么办 qq怎么解冻不了怎么办 qq号永久冻结怎么办 被微信封号31天怎么办 qq被永久冻结怎么办 深圳有房怎么办居住证 滴滴账号激活了怎么办 上海验车过期怎么办 门面租金太贵怎么办 中信卡被锁定怎么办 大学钱不够花怎么办