zoukankan      html  css  js  c++  java
  • BZOJ2132: 圈地计划

    BZOJ2132: 圈地计划

    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。
    任何数字不超过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

    题解Here!

    最小割模型。。。
    可以看这里:

    BZOJ3894: 文理分科

    好在这个题不需要拆点了。

    根据套路,我们设立源汇点$S,T$,将$S$连向商业区,工业区连向$T$。

    $BUT$!题目的联合代价是不同种类的区域!

    这怎么办?

    需要转化成我们会的东西——相同。

    注意到是四联通,那么黑白点染色。

    然后交换掉一种点的$A,B$的值。

    此时不同就变成相同了。

    具体可以看代码。

    于是这个问题就解决了。

    剩下的就是处理联合代价。

    那就从$x$连向$y$,再从$y$连向$x$即可。

    剩下的不多说。

    附代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<queue>
    #define MAXN 10010
    #define MAXM 150010
    #define MAX 999999999
    using namespace std;
    const int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1};
    int n,m,c=2,s,t,sum=0;
    int head[MAXN],deep[MAXN],C[110][110];
    struct Edge{
    	int next,to,w;
    }a[MAXM];
    inline int read(){
    	int date=0,w=1;char c=0;
    	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
    	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
    	return date*w;
    }
    inline int id(int x,int y){return (x-1)*m+y;}
    inline void add(int u,int v,int w){
    	a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;
    	a[c].to=u;a[c].w=0;a[c].next=head[v];head[v]=c++;
    }
    bool bfs(){
    	int u,v;
    	queue<int> q;
    	for(int i=1;i<=t;i++)deep[i]=0;
    	deep[s]=1;
    	q.push(s);
    	while(!q.empty()){
    		u=q.front();
    		q.pop();
    		for(int i=head[u];i;i=a[i].next){
    			v=a[i].to;
    			if(a[i].w&&!deep[v]){
    				deep[v]=deep[u]+1;
    				if(v==t)return true;
    				q.push(v);
    			}
    		}
    	}
    	return false;
    }
    int dfs(int x,int limit){
    	if(x==t)return limit;
    	int v,sum,cost=0;
    	for(int i=head[x];i;i=a[i].next){
    		v=a[i].to;
    		if(a[i].w&&deep[v]==deep[x]+1){
    			sum=dfs(v,min(a[i].w,limit-cost));
    			if(sum>0){
    				a[i].w-=sum;
    				a[i^1].w+=sum;
    				cost+=sum;
    				if(cost==limit)break;
    			}
    			else deep[v]=-1;
    		}
    	}
    	return cost;
    }
    int dinic(){
    	int ans=0;
    	while(bfs())ans+=dfs(s,MAX);
    	return ans;
    }
    void init(){
    	int u,v,x,y,w;
    	n=read();m=read();
    	s=n*m+1;t=n*m+2;
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++){
    		w=read();
    		sum+=w;
    		if((i+j)&1)add(id(i,j),t,w);
    		else add(s,id(i,j),w);
    	}
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++){
    		w=read();
    		sum+=w;
    		if((i+j)&1)add(s,id(i,j),w);
    		else add(id(i,j),t,w);
    	}
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)C[i][j]=read();
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++){
    		if((i+j)&1)continue;
    		u=id(i,j);
    		for(int k=0;k<4;k++){
    			x=i+fx[k];y=j+fy[k];
    			if(x<1||x>n||y<1||y>m)continue;
    			v=id(x,y);
    			w=C[i][j]+C[x][y];
    			add(u,v,w);
    			add(v,u,w);
    			sum+=w;
    		}
    	}
    }
    int main(){
    	init();
    	printf("%d
    ",sum-dinic());
    	return 0;
    }
    
  • 相关阅读:
    与众不同 windows phone (50)
    与众不同 windows phone (49)
    重新想象 Windows 8.1 Store Apps (93)
    重新想象 Windows 8.1 Store Apps 系列文章索引
    重新想象 Windows 8.1 Store Apps (92)
    重新想象 Windows 8.1 Store Apps (91)
    重新想象 Windows 8.1 Store Apps (90)
    重新想象 Windows 8.1 Store Apps (89)
    重新想象 Windows 8.1 Store Apps (88)
    重新想象 Windows 8.1 Store Apps (87)
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/10632852.html
Copyright © 2011-2022 走看看