【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1412

【题目大意】

  给出一块地图,1表示狼的领地,2表示羊的领地,0表示其余动物的领地,
  现在要求在格子的交界修篱笆使得羊狼的领地不能互通,求最短的篱笆长度

【题解】

  我们将每个格子之间连流量为1的边,狼和源点连流量为INF的边,
  羊和汇点连流量为INF的边,求此图的最小割,就是篱笆的最短修补。
  思路其实很简单,使得图被划分为两个部分,羊狼分离,因此就是最小割。
  求出最大流的值,就是答案了。

【代码】

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAX_V=20010;
struct edge{int to,cap,rev;};
vector<edge> G[MAX_V];
int level[MAX_V],iter[MAX_V];
void add_edge(int from,int to,int cap){G[from].push_back((edge){to,cap,G[to].size()});G[to].push_back((edge){from,0,G[from].size()-1});
}
void bfs(int s){memset(level,-1,sizeof(level));queue<int> que;level[s]=0;que.push(s);while(!que.empty()){int v=que.front(); que.pop();for(int i=0;i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0&&level[e.to]<0){level[e.to]=level[v]+1;que.push(e.to);}}}
}
int dfs(int v,int t,int f){if(v==t)return f;for(int &i=iter[v];i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0&&level[v]<level[e.to]){int d=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=d;G[e.to][e.rev].cap+=d;return d;}}}return 0;
}
int max_flow(int s,int t){int flow=0;for(;;){bfs(s);if(level[t]<0)return flow;memset(iter,0,sizeof(iter));int f;while((f=dfs(s,t,INF))>0){flow+=f;}}
}
int n,m;
int mp[110][110];
const int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
bool check(int x,int y){return x<n&&x>=0&&y<m&&y>=0;}
int main(){while(~scanf("%d%d",&n,&m)){int s=n*m,t=s+1;for(int i=0;i<=t;i++)G[i].clear();for(int i=0;i<n;i++)for(int j=0;j<m;j++){scanf("%d",&mp[i][j]);for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if(check(x,y))add_edge(i*m+j,x*m+y,1);}if(mp[i][j]==1)add_edge(s,i*m+j,INF);if(mp[i][j]==2)add_edge(i*m+j,t,INF);}printf("%d\n",max_flow(s,t));}return 0;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj1412.html

BZOJ 1412 [ZJOI2009]狼和羊的故事(最小割)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. NAACL| 基于标签感知的双迁移学习在医学命名实体识别中的应用
  2. sed,sort,uniq,join,cut,paste,split
  3. Bag-of-words model
  4. STL-容器库101--array【C11】
  5. flink和kafka区别_Apache Flink和Kafka入门
  6. SP2010开发和VS2010专家食谱--第三章节--高级工作流(2)--为沙盒解决方案创建自定义活动...
  7. 给lnmp一键包中的nginx安装openresty的lua扩展
  8. struts 国际化
  9. hbase java 分页查询_HBase伪快速分页查询
  10. [Windows] 【强力推荐】可以将任何格式的文档免费转换为高质量PDF文件的软件,珍藏宝贝!!!
  11. S变化广义s变化和时频域特征-matlab
  12. 快进来看看!!!C语言——扫雷小游戏(递归展开无雷区)
  13. python之excel编程
  14. 曾舜晞代言全面迸发!海信全面屏哈利手机发布
  15. 使用potplayer 录制视频
  16. Centos7——将网卡修改为任意名称
  17. urovo手持终重启_手持终端设备常见问题及维修方法
  18. Axure RP 9交互原型设计软件增加了哪些新功能
  19. Android开发资料
  20. uniapp web-view 网页 video播放器 全屏后无法横屏解决办法

热门文章

  1. WebDriver原理分析
  2. ICallbackEventHandler 前后台无刷新交互
  3. 跨平台 获取系统信息的python库 http://support.hyperic.com/disp
  4. 主机动手系列 — 怎么管理Suse Linux
  5. AI and logistics Patent
  6. 如果可能我们还是做好基础的事情吧
  7. 2021-08-25路演的反馈
  8. 《企业的边界》的书摘
  9. 35岁之后程序员的认可度不是很高
  10. rhel5.5配置yum