题目:BZOJ1412、洛谷P2598、Vijos P1555、codevs2351。

题目大意:有一个nm矩阵,每格里住着狼、羊或其他动物。现在要你建最少的篱笆,使得狼和羊分开。问最少建多长的篱笆。

解题思路:网络流最小割问题,求最大流即可。

首先建超级源点S=0,超级汇点T=nm+1。对于每只狼,从S到这只狼连接容量inf的边;对于每只羊,从这只羊到T连接容量inf的边。

然后,对于每个点,若该点不是羊,则从该点向它四个方向所有不是狼的点连接容量为1的边。

建完图后就是裸的最大流问题,用Dinic、ISAP等都可,EK应该也可。

我用的是Dinic。

C++ Code:

#include<stdio.h>
#include<cctype>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
int n,m,level[30003],iter[30003],a[103][103];
struct edges{int to,cap,rev;
};
vector<edges>G[200003];
queue<int>q;
inline int readint(){int p=0;char c=getchar();for(;!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())p=p*10+c-'0';return p;
}
inline void addedge(int from,int to,int cap){G[from].push_back((edges){to,cap,G[to].size()});G[to].push_back((edges){from,0,G[from].size()-1});
}
void bfs(int s){memset(level,-1,sizeof(level));level[s]=0;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<G[u].size();++i){edges& e=G[u][i];if(level[e.to]<0&&e.cap>0){level[e.to]=level[u]+1;q.push(e.to);}}}
}
int dfs(int u,int t,int f){if(u==t)return f;for(int& i=iter[u];i<G[u].size();++i){edges& e=G[u][i];if(e.cap>0&&level[e.to]>level[u]){int d=dfs(e.to,t,min(f,e.cap));if(d){e.cap-=d;G[e.to][e.rev].cap+=d;return d;}}}return 0;
}
int max_flow(int s,int t){int flow=0;while(1){bfs(s);if(level[t]<0)return flow;memset(iter,0,sizeof(iter));int f;while(f=dfs(s,t,INF))flow+=f;}
}
int main(){memset(a,-1,sizeof a);n=readint(),m=readint();for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)a[i][j]=readint();for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){if(a[i][j]==1)addedge(0,(i-1)*m+j,INF);elseif(a[i][j]==2)addedge((i-1)*m+j,n*m+1,INF);if(a[i][j]==2)continue;if(a[i+1][j]==2||a[i+1][j]==0)addedge((i-1)*m+j,i*m+j,1);if(a[i-1][j]==2||a[i-1][j]==0)addedge((i-1)*m+j,(i-2)*m+j,1);if(a[i][j+1]==2||a[i][j+1]==0)addedge((i-1)*m+j,(i-1)*m+j+1,1);if(a[i][j-1]==2||a[i][j-1]==0)addedge((i-1)*m+j,(i-1)*m+j-1,1);}printf("%d\n",max_flow(0,n*m+1));return 0;
}

转载于:https://www.cnblogs.com/Mrsrz/p/7612076.html

[ZJOI2009]狼和羊的故事相关推荐

  1. bzoj1412[ZJOI2009]狼和羊的故事

    bzoj1412[ZJOI2009]狼和羊的故事 题意: n*m网格,每个格子可能为狼.羊或空格.现在要在一些格子边界篱笆使羊狼分开,求最短篱笆.n,m≤100 题解: 最小割问题,建一个超级源和超级 ...

  2. 题解 P2598 【[ZJOI2009]狼和羊的故事】

    P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...

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

    题目链接 P2598 [ZJOI2009]狼和羊的故事 要让羊和狼都区别开来,需要的最小的割是多少?每只羊向四周有4个可能的方向,每只狼也是同样的,所以每个动物向周围可以跑出4个流,我们要建立栅栏,可 ...

  4. BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】

    BZOJ1412 ZJOI2009 狼和羊的故事 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...

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

    1412: [ZJOI2009]狼和羊的故事 >原题链接< Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......& ...

  6. [bzoj1934]: [ZJOI2009]狼和羊的故事

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

  7. [ZJOI2009]狼和羊的故事 题解

    狼和羊的故事 怎么说呢,这道题其实不难,只是题意有那么亿点点难理解.我最开始想复杂了,理解为了栅栏长度是格点的周长,那事情就复杂了... 题目分析: 首先,要明确的是:一个狼领地和羊领地之间只需建长度 ...

  8. 洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)

    题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼.羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开 题目分析:最大流最小割,建图方 ...

  9. 【bzoj】 1412: [ZJOI2009]狼和羊的故事

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

  10. [bzoj1412][ZJOI2009]狼和羊的故事

    bzoj100题啦  纪念一下. ----------------------------------------------------------------------------------- ...

最新文章

  1. NR 5G NAS非接入层
  2. 近两年火热的微服务springboot不同配置文件详细讲解
  3. ORB-SLAM3 细读单目初始化过程(上)
  4. Android入门(八) | 常用的界面布局 及 自定义控件
  5. Word2vec学习笔记总结
  6. 【精】C语言之变量存储类型
  7. Kafka : kafka查询某时间段内的消息
  8. 耶鲁大学公开课:哲学-死亡
  9. DeFi 借贷协议 NAOS Finance 完成种子轮融资
  10. git pull没有更新成功_关于git pull时出现的问题及解决反思
  11. JAVA毕业设计后勤管理系统计算机源码+lw文档+系统+调试部署+数据库
  12. 【windows】常见的系统环境变量,如%appdata%表示什么意思
  13. 简普科技Q3财报解读:业绩超过预期之后的更多确定性
  14. 公安部授权二代身份证阅读器的生产厂家(共十家)
  15. IOS调起app的终极方法:Universal Links
  16. linux网络协议栈(四)链路层 vlan处理
  17. 数据库应用----Mongodb 4.0 版本 基础操作---复制集,选举方法、部署认证 (二)
  18. java获取长度_获取java长度
  19. 什么网站适合高防服务器,什么叫高防服务器
  20. java代码递归查找部门和子部门id

热门文章

  1. auto.js B0021 图片查找 订阅功能 2021-10-07
  2. 如何保证邮件系统的安全?
  3. Facebook登录(Login Button)
  4. python 乘法口诀表
  5. 【第1131期】对于网络爬虫技术的攻与防
  6. uni-app微信小程序上传图片封装
  7. 解决Qualcomm Atheros QCA8172 有线网卡驱动问题
  8. CentOS 8/6宣布停用,来试试这些最佳替代方案吧!
  9. 内容超出DIV宽高后隐藏或出现滚动条和overflow的属性
  10. 数字可视化大屏边框制作