题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2598
n × m n\times m n×m的网格中有些格子上有狼,有些有羊,有些是空地。网格外边已经有一层栅栏,求至少还需要多少栅栏才可以把狼和羊分开。


思路:

很明显是一道网络流最小割的题目。众所周知,最小割=最大流。
源点连向所有含有羊的格子,流量为 I n f Inf Inf,所有含有狼的格子连向汇点,流量为 I n f Inf Inf。
接下来,每个相邻且不是同一种动物的点连边,流量为 1 1 1。很明显流了的边就相当于建立栅栏,而且满足栅栏长度最小。两只狼、两只羊相连并没有任何意义。这样可以减少复杂度。

加上当前弧优化即可过掉本题。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;const int N=200010;
const int M=510;
const int di[]={0,0,0,-1,1};
const int dj[]={0,1,-1,0,0};
int n,m,a[M][M],S,T,tot=1,cur[N],head[N],dep[N],maxflow,sum,x,y;struct edge
{int next,flow,to;
}e[N*2];void add(int from,int to,int flow)
{tot++;e[tot].flow=flow;e[tot].to=to;e[tot].next=head[from];head[from]=tot;
}bool bfs()  //分层
{memset(dep,0x3f3f3f3f,sizeof(dep));memcpy(cur,head,sizeof(cur));queue<int> q;dep[S]=1;q.push(S);while (q.size()){int u=q.front();q.pop();for (int i=head[u];~i;i=e[i].next){int v=e[i].to;if (dep[v]>dep[u]+1&&e[i].flow){dep[v]=dep[u]+1;q.push(v);}}}return dep[T]<1e9;
}int dfs(int u,int flow)
{int low=0;if (u==T){maxflow+=flow;return flow;}int used=0;for (int i=cur[u];~i;i=e[i].next){int v=e[i].to;cur[u]=i;if (e[i].flow&&dep[v]==dep[u]+1){low=dfs(v,min(flow-used,e[i].flow));if (low){used+=low;e[i].flow-=low;e[i^1].flow+=low;if(used==flow) break;}}}return used;
}void dinic()
{while (bfs())dfs(S,1e9);
}int main()
{memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);S=n*m+3;T=n*m+4;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)scanf("%d",&a[i][j]);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){x=i*m-m+j;if (a[i][j]==1){add(S,x,1e9);add(x,S,0);}if (a[i][j]==2){add(x,T,1e9);add(T,x,0);}if (a[i][j]<2)for (int k=1;k<=4;k++){if (i+di[k]<1||i+di[k]>n||j+dj[k]<1||j+dj[k]>m) continue;if (a[i+di[k]][j+dj[k]]==1) continue;y=(i+di[k])*m-m+(j+dj[k]);add(x,y,1);add(y,x,0);}}dinic();printf("%d\n",maxflow);return 0;
}

【洛谷P2598】狼和羊的故事【网络流】相关推荐

  1. 洛谷P2598 狼和羊的故事

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

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

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

  3. [ZJOI2009]狼和羊的故事

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

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

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

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

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

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

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

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

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

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

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

  9. 【BZOJ1412】【ZJOI2009】狼和羊的故事(网络流)

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

  10. 【图论专题二】【网络流部分】狼和羊的故事

    [浙江省省选2009]狼和羊的故事 题目 [ZJOI2009]狼和羊的故事 (Standard IO) Time Limits: 1000 ms Memory Limits: 256000 KB De ...

最新文章

  1. 线性表的顺序存储——顺序存储结构的抽象实现
  2. 数据结构第二章线性表学习笔记
  3. AJAX的异步请求小例子
  4. [模板]平面最近点对
  5. goland环境配置_Goland辅助工具goimports和gomodules
  6. jl1.如何设置元素的宽高包含元素的边框和内边距
  7. Linux 下Kill多进程的方法
  8. python中的for else语句
  9. GBDT原理及利用GBDT构造新的特征-Python实现
  10. STM32F103C8T6 硬件SPI+DMA 控制WS2811
  11. 【算法工程师】华为技术面面试记录
  12. 基于java+ssh+mysql实现的共享自行车单车租赁|出租管理系统项目源代码
  13. Ubuntu LogViewer调试工具
  14. 通过telnet命令使用SMTP、POP3协议收发邮件(以QQ邮箱为例)
  15. java contains忽略大小写_关于java:字符串包含-忽略大小写
  16. PIPI OJ 1203: PIPI发工资(拓扑排序)
  17. 一份来自区块链行业的《高考志愿填报指南》
  18. uniapp ->video 黑屏 无时长(新手容易遇到的坑)
  19. python中的get函数什么意思_详解python中get函数的用法(附代码)
  20. input·触发回车事件

热门文章

  1. (尚硅谷)JavaWeb新版教程09-QQZone项目总结
  2. python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库
  3. 网页中插入视频无法播放解决问题
  4. Windows7 GHOST Ultimate x86 V2.0万能预装版
  5. EXCEL中更改日期格式后,数据不刷新解决
  6. 服务器1000网卡匹配成100M问题解决
  7. linux下.run文件的安装与卸载
  8. 什么是数据分析?数据分析流程都有啥呢?
  9. 美语音标 [ɪ]在下列情况要发[i]的音
  10. Linux 服务器建站新手教程 (宝塔建站全流程)- 不需要敲一行命令 (记录啊、好东西)