题目链接:

https://www.luogu.org/problemnew/show/P2598

分析:

我们知道此题的目的是将狼和羊分割开,很容易想到狼在S,羊在T中。

首先,我们可以在狼,羊,空地这三者中四连通的连边,流量为1,此时可以表示无篱笆,割一条边就代表建起了长度为1的篱笆。

然后考虑狼如何向S连边呢?

因为狼和S之间的边我们是不能割掉的!

所以把流量赋值为inf即可。

羊和T同理。

然后跑最大流,即为最小割。

代码:

#include<cstdio>
#include<vector>
#include<cstring>
#include<vector>
#include<queue>
#define inf 0x7fffffff
using namespace std;
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
struct edge
{int to,val,rev;edge(int _to,int _val,int _rev){to=_to;val=_val;rev=_rev;}
};
vector<edge>e[10005];
void add(int x,int y,int w)
{e[x].push_back(edge(y,w,e[y].size()));e[y].push_back(edge(x,0,e[x].size()-1));
}int s,t;
int d[10005];
bool bfs()
{queue<int>q;memset(d,-1,sizeof(d));d[s]=0;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<e[x].size();i++){int y=e[x][i].to;if(d[y]==-1&&e[x][i].val){q.push(y);d[y]=d[x]+1;}}} if(d[t]==-1)return 0;return 1;
}
int id[105][105];
int dfs(int x,int low)
{if(x==t||low==0)return low;int totflow=0;for(int i=0;i<e[x].size();i++){int y=e[x][i].to;int rev=e[x][i].rev;if(d[y]==d[x]+1&&e[x][i].val){int a=dfs(y,min(low,e[x][i].val));e[x][i].val-=a;e[y][rev].val+=a;low-=a;totflow+=a;if(low==0)return totflow;}}if(low!=0)d[x]=-1;return totflow;
}
int main()
{int n,m;int cnt=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){id[i][j]=++cnt; }}s=0,t=cnt+1;int a;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&a);if(a==2){add(s,id[i][j],inf);}elseif(a==1){add(id[i][j],t,inf);}for(int k=1;k<=4;k++){int x=i+dx[k];int y=j+dy[k];if(x>0&&x<=n&&y>0&&y<=m){add(id[i][j],id[x][y],1);}}}}int ans=0;while(bfs()){ans+=dfs(s,inf);}printf("%d",ans);return 0;
}

洛谷P2598 [ZJOI2009]狼和羊的故事 题解相关推荐

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

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

  2. 洛谷P2598 [ZJOI2009]狼和羊的故事

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

  3. 【洛谷P2598】狼和羊的故事【网络流】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P2598 n × m n\times m n×m的网格中有些格子上有狼,有些有羊,有些是空地.网格外 ...

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

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

  5. P2598 [ZJOI2009]狼和羊的故事(网络流)

    我个人的理解: 可以先对原图进行建模为下图 其左端是狼,右端为羊,中间是连接狼和羊的路 现在为了让狼吃不到样,就要隔断狼和羊之间的连接 也就是 在这里,我们需要隔断狼和羊之间的连接,也就是转化成最小割 ...

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

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

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

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

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

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

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

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

最新文章

  1. 机器学习(14)逻辑回归(理论)
  2. Java学习笔记二十五:Java面向对象的三大特性之多态
  3. Android中removeCallbacks失效原因
  4. 前端相关的一些小工具
  5. 产品经理必须要知道的25个简约设计理念
  6. window.open 弹出居中窗口
  7. 怎么用git将本地代码上传到远程服务器_git命令 将本地代码上传到远程服务器...
  8. python文件查重并合并_Python实现文件信息进行合并实例代码
  9. PyQt5笔记(01) -- 创建空白窗体
  10. c语言lr分析器的设计与实现_[源码和文档分享]基于有限自动机的词法分析器构造...
  11. 跨境电商ERP是什么?
  12. cannot be cast to android.support.v4.app.Fragment
  13. Redis进阶: 锁的使用
  14. Ubuntu上安装NS3(最详细的图文介绍)
  15. ktt算法 约化_matlab在热学中的应用
  16. 车联网白皮书 (网联自动驾驶分册)
  17. Android设置默认输入法
  18. GitHub Copilot 被爆存在安全漏洞,涉及四成代码
  19. PRes 语言常用参考
  20. 6nm工艺的微观神话,于毫厘间雕刻5G的“神笔马良”

热门文章

  1. 【ICML2022】可达性约束强化学习
  2. P110 03-掌握vue-router懒加载的使用
  3. ZOJ 3716 - Ribbon Gymnastics
  4. tk芯片智能机刷机方法_滴,欢迎回家!凯迪仕智能锁 TK2 使用小记
  5. matlab 定义张量,如何使用MATLAB作张量运算
  6. Linux上安装Adminer
  7. ,CFormView::Create()里,_AfxCheckDialogTemplate输出Cannot find dialog template with IDD 0x00AB
  8. Flink教程(10)-BroadCast State和BroadCast Stream
  9. 2000万直播数据看20万游戏主播能否月入100万
  10. 怎样投注‘11选5’中奖更多