zoukankan      html  css  js  c++  java
  • 洛谷 P2598 [ZJOI2009]狼和羊的故事

    题目描述

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

    输入输出格式

    输入格式:

    文件的第一行包含两个整数n和m。接下来n行每行m个整数,1表示该格子属于狼的领地,2表示属于羊的领地,0表示该格子不是任何一只动物的领地。

    输出格式:

    文件中仅包含一个整数ans,代表篱笆的最短长度。

    输入输出样例

    输入样例#1:
    2 2
    2 2 
    1 1 
    输出样例#1:
    2
    

    说明

    数据范围

    10%的数据 n,m≤3

    30%的数据 n,m≤20

    100%的数据 n,m≤100

    最小割 

    屠龙宝刀点击就送

    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define N 30000
    #define inf 0x3f3f3f3f
    #define cl(a,b) memset(a,b,sizeof(a))
    using namespace std;
    int n,m,ans,cnt=1,fx[5]={1,-1,0,0},fy[5]={0,0,-1,1},to[N<<1],cur[N],dep[N],head[N],nextt[N<<1],flow[N<<1],G[105][105];
    inline void ins(int u,int v,int w)
    {
        nextt[++cnt]=head[u];to[cnt]=v;flow[cnt]=w;head[u]=cnt;
        nextt[++cnt]=head[v];to[cnt]=u;flow[cnt]=0;head[v]=cnt;
    }
    bool bfs(int S,int T)
    {
        cl(dep,-1);
        queue<int>q;
        q.push(S);
        dep[S]=0;
        for(int i=S;i<=T;++i) cur[i]=head[i];
        for(int u;!q.empty();)
        {
            u=q.front();q.pop();
            for(int i=head[u];i;i=nextt[i])
            {
                int v=to[i];
                if(dep[v]==-1&&flow[i])
                {
                    dep[v]=dep[u]+1;
                    if(v==T) return true;
                    q.push(v);
                }
            }
        }
        return false;
    }
    inline int min(int a,int b) {return a>b?b:a;}
    int dfs(int u,int T,int limit)
    {
        if(u==T||!limit) return limit;
        int f,res=0;
        for(int &i=cur[u];i;i=nextt[i])
        {
            int v=to[i];
            if(dep[v]==dep[u]+1&&flow[i]&&(f=dfs(v,T,min(limit,flow[i]))))
            {
                flow[i]-=f;
                flow[i^1]+=f;
                res+=f;
                limit-=f;
                if(!limit) break;
            }
        }
        if(res!=limit) dep[u]=-1;
        return res;
    }
    int main(int argc,char *argv[])
    {
        scanf("%d%d",&n,&m);
        int S=0,T=n*m+1;
        for(int i=1;i<=n;++i)
         for(int j=1;j<=m;++j)
          scanf("%d",&G[i][j]);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
            {
                if(G[i][j]==1) ins(S,(i-1)*m+j,inf);
                else if(G[i][j]==2) ins((i-1)*m+j,T,inf);
                for(int k=0;k<4;++k)
                {
                    int x=i+fx[k],y=j+fy[k];
                    if(x<1||x>n||y<1||y>m||G[i][j]==2) continue;
                    if(G[i][j]!=1||G[x][y]!=1) ins((i-1)*m+j,(x-1)*m+y,1);
                }
            }
        while(bfs(S,T))
        ans+=dfs(S,T,inf);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    NET 2.0(C#)调用ffmpeg处理视频的方法(转载)
    ffmpeg编解码详细过程(转载)
    使用FFMPEG SDK解码流数据
    FFMPEG解码流程
    web worker,SSE,WebSocket,AJAX 与后端交互的方式
    jQuery基础篇
    Git的基本命令介绍
    项目配置中 提示access denied的问题 解决方案
    http网络协议 学习摘要
    OSI七层模型 学习摘要
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7678756.html
Copyright © 2011-2022 走看看