【ZJOI2009】狼和羊的故事

原创 2015年11月18日 19:40:51

题目

“狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......”
  Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干!
  Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆。可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已。所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养。
  通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非常暴躁,不利于他们的成长。
  Orez想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地,再就是篱笆必须修筑完整,也就是说必须修建在单位格子的边界上并且不能只修建一部分。
  【数据范围】
  10%的数据 n,m≤3
  30%的数据 n,m≤20
  100%的数据 n,m≤100

题意

给你一个n*m的矩阵,让你求用尽量少的篱笆,把羊和狼分开。

分析

我们可以发现,这题的篱笆,就是把两个集合(羊和狼)一分为二,而且又是费用最小,所以我们自然的想到了最小割。
我们接着考虑建图:
从源点向所有的狼连一条容量为maxlongint的边,然后再从所有的羊向汇点连一条容量为maxlongint的边,狼向周围的空地和羊连容量为1的边,空地往周围空地和羊连一条容量为1的边,这样跑一次最大流便可以了。

代码

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

★【动态规划】【状态压缩】【容斥原理】【ZJOI2009】多米诺骨牌

Description   有一个n×m的矩形表格,其中有一些位置有障碍。现在要在这个表格内放一些1×2或者2×1的多米诺骨牌,使得任何两个多米诺骨牌没有重叠部分,任何一个骨牌不能放到障碍上。并且满足...
  • Whjpji
  • Whjpji
  • 2012年04月10日 16:36
  • 2865

【BZOJ1412】[ZJOI2009]狼和羊的故事【最小割】

【题目链接】 显然是最小割... 随便抽了个题怎么又是网络流... /* Pigonometry */ #include #include using namespace std; ...

Dinic 算法求最大流(最小割) POJ 2536

题意:给定n, m, s, v, 意思是有n只兔子,m个洞,兔子的跑步速度是v,兔子有s的时间跑进洞里,给定兔子和洞的坐标,问最少有多少只兔子在s时间内无法跑进洞里。 这道题是在Openjudge上看...

[BZOJ1412] [ZJOI2009] 狼与羊的故事 (最小割)

给定一个N×MN \times M方格矩阵,每个格子可在0,1,20,1,2中取值。要求在方格的边上进行划分,使得任意联通块内不同时包含11和22的格子。若对方格矩阵的形式感到困惑,我们可以先考虑图上...
  • Mollnn
  • Mollnn
  • 2017年12月08日 22:21
  • 26

BZOJ P1412[ZJOI2009]狼和羊的故事

最小割经典例题 因为我们要把狼和羊隔开 但是在狼和羊的占地上是允许空地存在的所以我们 把狼到空地和羊的地方连一条流量为1的边 把空地到羊的地方连一条流量为1的边 然后S到所有狼连一条为inf...

BZOJ1412 [ZJOI2009]狼和羊的故事 【最小割】

1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3454  Solved: 1733 [Submi...

【ZJOI2009】[JZOJ1637] 狼和羊的故事

Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......”   Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?...

ZJOI 2009 狼和羊的故事 网络流

题目: “狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可...
  • dy0607
  • dy0607
  • 2017年01月12日 19:05
  • 193

【bzoj】1412: [ZJOI2009]狼和羊的故事||最小割

[众神入此门去切题吧hhhQAQ]喜欢这首QAQ…歌曲可能单一了~之后再去找其他的链接~~ (http://www.lydsy.com/JudgeOnline/problem.php?id=1412...
  • fd_xuan
  • fd_xuan
  • 2015年11月29日 00:26
  • 326

BZOJ [ZJOI2009]狼和羊的故事

数据范围 10%的数据 n,m≤3 30%的数据 n,m≤20 100%的数据 n,m≤100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【ZJOI2009】狼和羊的故事
举报原因:
原因补充:

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