题目链接:点击查看

题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼、羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开

题目分析:最大流最小割,建图方式如下:

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110*110;int n,m;struct Edge
{int to,w,next;
}edge[N*10];//边数int head[N],cnt;void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=w;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(now,0,sizeof(now));memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}int get_id(int x,int y)
{return (x-1)*m+y;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();scanf("%d%d",&n,&m);int st=N-1,ed=st-1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(j!=m)addedge(get_id(i,j),get_id(i,j+1),1);if(i!=n)addedge(get_id(i,j),get_id(i+1,j),1);int num;scanf("%d",&num);if(num==1)addedge(st,get_id(i,j),inf);if(num==2)addedge(get_id(i,j),ed,inf);}printf("%d\n",solve(st,ed));return 0;
}

洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)相关推荐

  1. 洛谷P2598 [ZJOI2009]狼和羊的故事 题解

    题目链接: https://www.luogu.org/problemnew/show/P2598 分析: 我们知道此题的目的是将狼和羊分割开,很容易想到狼在S,羊在T中. 首先,我们可以在狼,羊,空 ...

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

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

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

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

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

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

  5. 1412: [ZJOI2009]狼和羊的故事 最小割

    高一的时候似乎做了--然后我现在发现不会做了.. (高一代码抄多了QAQ) 题目要求的是将狼和羊分开,可以看做是分成两个点集,要使代价最小,那么也就是求一个最小割. 首先S->狼连边,权值为+∞ ...

  6. bzoj 1412 [ZJOI2009]狼和羊的故事 最小割建图

    题面 题目传送门 解法 把\(S\)集看作和羊连接,\(T\)看作和狼连接 然后就转化成了基本的最小割模型了 对于0的处理,可以把它放在羊和狼两排点的中间,由\(S\rightarrow\)羊\(\r ...

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

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

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

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

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

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

最新文章

  1. iOS进阶_Socket(Socket简介代码演练)
  2. Leetcode 33.搜索旋转排序数组 (每日一题 20210707)
  3. 欠阿里云一分钱,会是什么样的后果。。。
  4. tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结
  5. 工作中常用的但是又容易忽略的问题
  6. Windows Store App JavaScript 开发:选取文件和文件夹
  7. python 高阶函数之filter
  8. yolov5 行人 车辆 跟踪 检测 计数
  9. 读书印记 - 《批判性思维工具》
  10. android 登录界面 布局,Android基本布局和登录界面的设计
  11. 【旺铺2012分享】导航CSS代码使用修改技巧!
  12. 华为认证: 高级redhat例题及答案
  13. android手机和包支付,和包支付app
  14. HTML图片映射矩形坐标,HTML图片热区map area的用法(转载)
  15. 计算机专业会涉及数学吗,数学不好的人还适合学计算机吗?
  16. 视觉显著性python_OpenCV中的显著性检测(Saliency Detection)
  17. 联想模拟器无网络(快速)
  18. 【图解】连狗子都能看懂的Python基础总结(二)什么是库、包、模块?
  19. 05【数据的备份与恢复】
  20. matlab模拟短波天波,短波的天波传播衰减预测模型

热门文章

  1. php生成对象吗,php生成器对象
  2. oracle 建表时间戳类型,Oracle插入timestamp类型数据详解
  3. 微服务一定要使用Spring-Cloud吗?
  4. Servlet 请求处理
  5. 关于DubboMain启动的真相
  6. 简单了解RestTemplate消息读取的转化
  7. ArrayBlockingQueue原理分析-put方法
  8. 使用ln -s解决库冲突的问题
  9. 关于idea右侧的maven project 如何调出来
  10. Spring Boot定时任务-SpringBoot整合Quartz