BZOJ 1412 [ZJOI2009]狼和羊的故事(最小割)
【题目链接】 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]狼和羊的故事(最小割)相关推荐
- bzoj 1412 [ZJOI2009]狼和羊的故事 最小割建图
题面 题目传送门 解法 把\(S\)集看作和羊连接,\(T\)看作和狼连接 然后就转化成了基本的最小割模型了 对于0的处理,可以把它放在羊和狼两排点的中间,由\(S\rightarrow\)羊\(\r ...
- 1412: [ZJOI2009]狼和羊的故事 最小割
高一的时候似乎做了--然后我现在发现不会做了.. (高一代码抄多了QAQ) 题目要求的是将狼和羊分开,可以看做是分成两个点集,要使代价最小,那么也就是求一个最小割. 首先S->狼连边,权值为+∞ ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 >原题链接< Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......& ...
- 【bzoj】 1412: [ZJOI2009]狼和羊的故事
Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合 ...
- 洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)
题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼.羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开 题目分析:最大流最小割,建图方 ...
- [bzoj1934]: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3105 Solved: 1567 [Submit][ ...
- bzoj1412[ZJOI2009]狼和羊的故事
bzoj1412[ZJOI2009]狼和羊的故事 题意: n*m网格,每个格子可能为狼.羊或空格.现在要在一些格子边界篱笆使羊狼分开,求最短篱笆.n,m≤100 题解: 最小割问题,建一个超级源和超级 ...
- 题解 P2598 【[ZJOI2009]狼和羊的故事】
P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...
- [ZJOI2009]狼和羊的故事【最小割】
题目链接 P2598 [ZJOI2009]狼和羊的故事 要让羊和狼都区别开来,需要的最小的割是多少?每只羊向四周有4个可能的方向,每只狼也是同样的,所以每个动物向周围可以跑出4个流,我们要建立栅栏,可 ...
最新文章
- NAACL| 基于标签感知的双迁移学习在医学命名实体识别中的应用
- sed,sort,uniq,join,cut,paste,split
- Bag-of-words model
- STL-容器库101--array【C11】
- flink和kafka区别_Apache Flink和Kafka入门
- SP2010开发和VS2010专家食谱--第三章节--高级工作流(2)--为沙盒解决方案创建自定义活动...
- 给lnmp一键包中的nginx安装openresty的lua扩展
- struts 国际化
- hbase java 分页查询_HBase伪快速分页查询
- [Windows] 【强力推荐】可以将任何格式的文档免费转换为高质量PDF文件的软件,珍藏宝贝!!!
- S变化广义s变化和时频域特征-matlab
- 快进来看看!!!C语言——扫雷小游戏(递归展开无雷区)
- python之excel编程
- 曾舜晞代言全面迸发!海信全面屏哈利手机发布
- 使用potplayer 录制视频
- Centos7——将网卡修改为任意名称
- urovo手持终重启_手持终端设备常见问题及维修方法
- Axure RP 9交互原型设计软件增加了哪些新功能
- Android开发资料
- uniapp web-view 网页 video播放器 全屏后无法横屏解决办法