【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.
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

BZOJ [ZJOI2009]狼和羊的故事

数据范围 10%的数据 n,m≤3 30%的数据 n,m≤20 100%的数据 n,m≤100

BZOJ P1412[ZJOI2009]狼和羊的故事

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

ZJOI2009 狼和羊的故事

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

BZOJ 1412: [ZJOI2009]狼和羊的故事

题目地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1412 题目大意:将一个矩阵中的1和2分隔,求出最小的分隔代价。 算法讨...

BZOJ 1412 ZJOI 2009 狼和羊的故事 最小割

题目大意:一个农场中有狼和羊,现在要将他们用围栏分开,问最少需要多少围栏。 思路:所有源向所有狼连边,所有羊向汇连边,图中的每个相邻的格子之间连边,然后跑S->T的最大流,也就是把狼和羊分开...

bzoj1433 [ZJOI2009]假期的宿舍

明天省选攒rp

【BZOJ 1433】 [ZJOI2009]假期的宿舍

二分图求最大匹配~

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

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

【容斥原理+状态压缩】zjoi2009 多米诺骨牌

转送门:zjoi2009 多米诺骨牌  彻彻底底的被这道题虐了,想了一个月没想出来,最后和宇宙大总统一起强肯了2个小时标程算是看懂了。。首先抛开这道题的那个奇怪的限制(没行列没有骨牌跨过),一个赤裸裸...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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