zoukankan      html  css  js  c++  java
  • 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面

    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

    问题描述
    背景:
    神犇CJK最近突然意识到他虽然开得多,但是终究没有领会到开的真谛。
    比如说每过完一天,回复的精力值经常超过上限,这样产生了很大的浪费。
    于是向XLightGod请教,于是发现XlightGod不知道比自己高到哪里去了 。
    于是通过与XLightGod的一番谈笑风生,
    他在休息的时候也能获得收益,而且还get了一个特技
    于是准备改进他的开法,于是他准备制定了一个计划
    题目描述:
    CJK的计划是一个n*m的矩阵,矩阵的每一个格子代表一天,他每天有两种选择:
    开与不开,每种选择都会有不同的收益。当然他还有一个奇奇怪怪的技能:
    如果开与不开相间的话,他将获得额外的收益。具体来说,如果格子(i,j)相邻(相邻是指两个
    格子有公共边)有K块(显然K不超过4)类型不同于(I,j)的格子,则这个格子能增加k×Cij收益,
    你能帮助CJK求出他能获得的最大收益吗?
    输入格式
    第一行两个整数n,m,表示矩阵的行数与列数。
    接下来一个n*m的矩阵,矩阵的第i行第j列表示(i,j)这格子选择开能获得的收益
    接下来一个n*m的矩阵,矩阵的第i行第j列表示(i,j)这个格子选择不开能获得的收益
    接下来一个n*m的矩阵,矩阵的第i行第j列表示(i,j)这个格子的Cij(见题目描述)
    输出格式
    输出一行,表示最大收益
    样例输入输出

    样例输入1
    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
    样例输出1
    81
    限制与约定
    对于30%的数据,n,m<=5
    对于100%的数据,n,m<=100
    不需要开long long

    思路:最小割。

    与“为了博多”很像,只不过一个是同样的一个是不同的。

    考虑这是个二分图,可以将一些边反过来。。。

    对所有点黑白染色,然后对于黑色点b连接(S,b,kai),(b,T,bukai),对于白色点w连接(S,w,bukai)(w,T,bukai),然后对于相邻的点a,b连接(a,b,C[a]+C[b])跑最小割就OK了。。。。

    PS.今天终于知道最小割有个优化了。。。一直TLE,还有为了博多1000+ms。。。

    本来可以切的。。。

    PS2.BZOJ应该过不去,数据水。。。。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #define inf 19260817
     5 using namespace std;
     6 #define rep(a,b,c) for(rg int a=b;a<=c;a++)
     7 #define drep(a,b,c) for(rg int a=b;a>=c;a--)
     8 #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
     9 #define il inline
    10 #define rg register
    11 #define vd void
    12 #define t (dis[i])
    13 typedef long long ll;
    14 il int gi(){
    15     rg int x=0;rg char ch=getchar();
    16     while(ch<'0'||ch>'9')ch=getchar();
    17     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    18     return x;
    19 }
    20 const int maxn=10005,S=10001,T=10002,maxm=10010*12;
    21 int id=1,fir[maxn],dis[maxm],nxt[maxm],w[maxm];
    22 il vd add(int a,int b,int c){
    23     nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;
    24     if(c)add(b,a,0);
    25 }
    26 int num[101][101],C[101][101],dep[maxn],head[maxn];
    27 il bool BFS(){
    28     rg int que[maxn],hd=0,tl=1;
    29     memset(dep,0,sizeof dep);
    30     que[hd]=S,dep[S]=1;
    31     while(hd-tl){
    32     int now=que[hd++];
    33     erep(i,now)if(!dep[t]&&w[i])que[tl++]=t,dep[t]=dep[now]+1;
    34     }
    35     return dep[T];
    36 }
    37 il int Dinic(int now,int maxflow){
    38     if(now==T)return maxflow;
    39     rg int ret=0;
    40     for(rg int&i=head[now];i;i=nxt[i])if(w[i]&&dep[t]==dep[now]+1){
    41     rg int d=Dinic(t,min(maxflow,w[i]));
    42     w[i]-=d,w[i^1]+=d,maxflow-=d,ret+=d;
    43     if(!maxflow)break;
    44     }return ret;
    45 }
    46 int main(){
    47     rg int n=gi(),m=gi(),sum=0,a;
    48     rep(i,1,n)rep(j,1,m)num[i][j]=++num[0][0];
    49     rep(i,1,n)rep(j,1,m){
    50         a=gi(),sum+=a;if((i+j)&1)add(S,num[i][j],a);else add(num[i][j],T,a);
    51     }
    52     rep(i,1,n)rep(j,1,m){
    53     a=gi(),sum+=a;if((i+j)&1)add(num[i][j],T,a);else add(S,num[i][j],a);
    54     }
    55     rep(i,1,n)rep(j,1,m){
    56     C[i][j]=gi();
    57     if(i-1)sum+=C[i][j];if(j-1)sum+=C[i][j];if(i-n)sum+=C[i][j];if(j-m)sum+=C[i][j];
    58     }
    59     rep(i,1,n)rep(j,1,m){
    60     if(i-1)add(num[i][j],num[i-1][j],C[i][j]+C[i-1][j]);
    61     if(j-1)add(num[i][j],num[i][j-1],C[i][j]+C[i][j-1]);
    62     if(i-n)add(num[i][j],num[i+1][j],C[i][j]+C[i+1][j]);
    63     if(j-m)add(num[i][j],num[i][j+1],C[i][j]+C[i][j+1]);
    64     }
    65     while(BFS())memcpy(head,fir,sizeof head),sum-=Dinic(S,inf);
    66     printf("%d
    ",sum);
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    几种加密算法的java实现包括MD5、RSA、SHA256
    js 向form表单中插入数据
    HTTP的长短连接、长短轮询的区别(转载)
    try catch finally 关闭流标准的写法
    从黑格尔的正反合理论看人生的三个阶段
    《人人都是产品经理》读书笔记
    什么是PRD、MRD与BRD
    关于B/S系统中文件上传的大小限制怎么做
    如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
    web页面开发笔记(不断更新)
  • 原文地址:https://www.cnblogs.com/xzz_233/p/7221903.html
Copyright © 2011-2022 走看看