【2011集训队出题】圈地计划

原创 2015年11月18日 20:41:34

题目

最近房地产商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求出一个收益最大的方案么?

分析

我们可以很明显的看到约束条件,二元关系,和它们选和不选的利润,所以自然而然想到了最小割。
那么怎么割呢,那么多条件。
我们再分析,我么可以把这些点分成两组:
商业区和工业区。
那么我们便可以根据每个点和它周围的关系连边,设两个点(x,y)(l,r)
若它们都是商业区,那么利润为Ax,y+Al,r
若它们都是工业区,那么利润为Bx,y+Bl,r
若它们不同,且x,y为商业区,那么利润为Ax,y+Bl,r+Cx,y+Cl,r
然后我们会想到这两个点有关系只能是相邻的点,故我们可以从这里下手:
黑白染色。
然后我们便这样染色:
源点向每个黑点连Ax,y,每个白点Bx,y
每个黑点连汇点Bx,y,每个白点连汇点Ax,y
于是每个黑点向每个白点连Cx,y+Cl,r双向边
至于为什么对,请读者自行思考。

var
    n,m,t,i,j,k,x,y,nu,ans,pp,an:longint;
    a1,b1,c,co:array[1..100,1..100] of longint;
    q:array[1..4,1..2] of longint=((0,1),(1,0),(-1,0),(0,-1));
    las,b,nex,f,a,dis:array[0..30000] of longint;
function min(l,r:longint):longint;
begin
   if l<r then exit(l);exit(r);
end;
procedure insert(x,y,z,k:longint);
begin
   inc(nu);b[nu]:=y;nex[nu]:=las[x];las[x]:=nu;f[nu]:=z;
   inc(nu);b[nu]:=x;nex[nu]:=las[y];las[y]:=nu;f[nu]:=k;
end;
function bfs:boolean;
var l,r,p:longint;
begin
    fillchar(dis,sizeof(dis),0);dis[0]:=1;l:=0;r:=1;a[1]:=0;
    while l<r do begin
       inc(l);p:=las[a[l]];
       while p<>0 do begin
          if (dis[b[p]]=0)and(f[p]>0) then begin
             dis[b[p]]:=dis[a[l]]+1;inc(r);a[r]:=b[p];
          end;p:=nex[p];
       end;
    end;
    exit(dis[t]>0);
end;
function dinic(x,y:longint):longint;
var p,o:longint;
begin
    if x=t then exit(y);
    dinic:=0;p:=las[x];
    while p<>0 do begin
       if (dis[b[p]]=dis[x]+1)and(f[p]>0) then begin
          o:=dinic(b[p],min(y,f[p]));
          if o>0 then begin
             dec(f[p],o);inc(f[p xor 1],o);inc(dinic,o);dec(y,o);
          end;
       end;p:=nex[p];
    end;
end;
begin
    readln(n,m);t:=n*m+1;nu:=1;
    for i:=1 to n do for j:=1 to m do begin read(a1[i,j]);ans:=ans+a1[i,j];end;
    for i:=1 to n do for j:=1 to m do begin read(b1[i,j]);ans:=ans+b1[i,j];end;
    for i:=1 to n do for j:=1 to m do read(c[i,j]);
    for i:=1 to n do for j:=1 to m do if (i+j)mod 2=1 then co[i,j]:=1;
    for i:=1 to n do
        for j:=1 to m do begin
        if co[i,j]=1 then begin insert(0,(i-1)*m+j,a1[i,j],0);insert((i-1)*m+j,t,b1[i,j],0);end
        else begin insert(0,(i-1)*m+j,b1[i,j],0);insert((i-1)*m+j,t,a1[i,j],0);end;
        for k:=1 to 4 do begin
           x:=i+q[k,1];y:=j+q[k,2];
           if (x<1)or(y<1)or(x>n)or(y>m) then continue;
           insert((i-1)*m+j,(x-1)*m+y,c[i,j]+c[x,y],0);pp:=pp+c[i,j]+c[x,y];
        end;
        end;
    while bfs do
    an:=an+dinic(0,maxlongint);
    writeln(ans+pp div 2-an);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

【2011集训队出题】happiness

Description  高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋...
  • u011056504
  • u011056504
  • 2016年10月31日 19:47
  • 273

JZOJ1981. 【2011集训队出题】Digit

Description   在数学课上,小T又被老师发现上课睡觉了。为了向全班同学证明小T刚才没有好好听课,数学老师决定出一道题目刁难一下小T,如果小T答不出,那么……   情节就按照俗套的路线发...
  • lijf2001
  • lijf2001
  • 2018年01月04日 17:19
  • 69

【2011集训队出题】【GDKOI2010】圈地计划

二元关系 这是两道题,大体相同,不过有一点点不同 我在题目描述中称为题1和题2Description最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nut...
  • u011056504
  • u011056504
  • 2016年10月31日 19:31
  • 335

[JZOJ1919] [BZOJ2127]【2011集训队出题】happiness(最小割之二元关系)

Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好...
  • hzj1054689699
  • hzj1054689699
  • 2016年11月04日 20:28
  • 386

【数学】2011集训队出题 跳跳棋

【2011集训队出题】 跳跳棋 by 何朴藩 【问题描述】 跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋...
  • hedongnike
  • hedongnike
  • 2014年03月27日 11:44
  • 615

【2011集训队出题】Construct

Description:   随着改革开放的深入推进……   小T家要拆迁了……   当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户。   ...
  • Cold_Chair
  • Cold_Chair
  • 2018年01月05日 18:50
  • 71

【2011集训队出题】Digit

Description:   在数学课上,小T又被老师发现上课睡觉了。为了向全班同学证明小T刚才没有好好听课,数学老师决定出一道题目刁难一下小T,如果小T答不出,那么……   情节就按照俗套的路线...
  • Cold_Chair
  • Cold_Chair
  • 2018年01月05日 18:54
  • 84

【集训队作业】MONOPLOY

题目大意给出一棵nn个点,根为00的树,要求实现QQ个操作,包含以下两种。 将xx到根染成一种区别于之前所有颜色的颜色 查询以xx为根的子树的所有点到根的距离和 在这里距离的定义,假如两个相邻城市之间...
  • Yves___
  • Yves___
  • 2015年09月24日 16:27
  • 478

bzoj2144 【国家集训队2011】跳跳棋

Description 跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳...
  • qq_21494715
  • qq_21494715
  • 2017年02月02日 10:49
  • 443

【集训队出题2011】大楼 题解

题目出自陈许旻 题目大意      ~~~~~~有一栋楼,每层有 n 个房间。       ~~~~~~房间之间的连通性用一个矩阵给出,对于 A[i,j]=w,表示对于任意的 x,可以从第 x 层的...
  • rzO_KQP_Orz
  • rzO_KQP_Orz
  • 2017年03月16日 22:33
  • 365
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【2011集训队出题】圈地计划
举报原因:
原因补充:

(最多只允许输入30个字)