[bzoj1934]: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3105 Solved: 1567
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2 2
1 1
Sample Output
数据范围
10%的数据 n,m≤3
30%的数据 n,m≤20
100%的数据 n,m≤100
HINT
Source
题解
最小割的定义是:
割
编辑
最小割
编辑
那么此题要求狼和样不连通 实质上就是求最小割 使源点和汇点不连通
那么就把源点连所有狼 汇点连所有羊(反过来应该也可以)
然后再把每个点和四个周围的点连起来 求个最小割=最大流 就行了
hzwer的做法 更好一点 参见代码注释中写的
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define inf 0x7ffffff
using namespace std;
struct edge{int to,next,flow;}e[1000000];
int d[10005],head[10005];int n,m,start=0,end=10001,cnt=1,max_flow=0;
int mp[105][105];
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
queue<int>q;
void ini(int x,int y,int flow){e[++cnt].to=y;e[cnt].flow=flow;e[cnt].next=head[x];head[x]=cnt;
}
void insert(int x,int y,int flow){ini(x,y,flow);ini(y,x,0);
}
bool bfs(){memset(d,-1,sizeof(d));q.push(start);d[start]=0;while(!q.empty()){int k=q.front();q.pop();for(int i=head[k];i;i=e[i].next){int kk=e[i].to;if(e[i].flow&&d[kk]==-1){d[kk]=d[k]+1;q.push(kk);}}}return d[end]!=-1;
}
int dfs(int x,int f){if(x==end) return f;int w,used=0;for(int i=head[x];i;i=e[i].next){int k=e[i].to;if(e[i].flow&&d[k]==d[x]+1){w=f-used;w=dfs(k,min(w,e[i].flow));e[i].flow-=w;e[i^1].flow+=w;used+=w;if(used==f) return f;}}if(!used) d[x]=-1;return used;
}
void dinic(){while(bfs()){max_flow+=dfs(start,inf);}
}
int mk(int x,int y){return (x-1)*m+y;
}
int main(){scanf("%d%d",&n,&m);int x;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&x);mp[i][j]=x;if(x==1) insert(start,mk(i,j),inf);else if(x==2) insert(mk(i,j),end,inf);}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=1;k<=4;k++){int tx=i+dx[k],ty=j+dy[k];//题解的写法 狼向空地和羊连 空地向四个方向连 速度快一点 //if(tx<1||ty<1||tx>n||ty>m||mp[i][j]==2) continue;//if(mp[i][j]!=1||mp[tx][ty]!=1)//狼->羊&空地 空地->羊 //我的写法是所有点向四个方向连 速度慢50ms if(tx<1||ty<1||tx>n||ty>m) continue;insert(mk(i,j),mk(tx,ty),1);}dinic();printf("%d",max_flow);return 0;
}
[bzoj1934]: [ZJOI2009]狼和羊的故事相关推荐
- bzoj1412[ZJOI2009]狼和羊的故事
bzoj1412[ZJOI2009]狼和羊的故事 题意: n*m网格,每个格子可能为狼.羊或空格.现在要在一些格子边界篱笆使羊狼分开,求最短篱笆.n,m≤100 题解: 最小割问题,建一个超级源和超级 ...
- 题解 P2598 【[ZJOI2009]狼和羊的故事】
P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...
- [ZJOI2009]狼和羊的故事【最小割】
题目链接 P2598 [ZJOI2009]狼和羊的故事 要让羊和狼都区别开来,需要的最小的割是多少?每只羊向四周有4个可能的方向,每只狼也是同样的,所以每个动物向周围可以跑出4个流,我们要建立栅栏,可 ...
- BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】
BZOJ1412 ZJOI2009 狼和羊的故事 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 >原题链接< Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......& ...
- [ZJOI2009]狼和羊的故事 题解
狼和羊的故事 怎么说呢,这道题其实不难,只是题意有那么亿点点难理解.我最开始想复杂了,理解为了栅栏长度是格点的周长,那事情就复杂了... 题目分析: 首先,要明确的是:一个狼领地和羊领地之间只需建长度 ...
- 洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)
题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼.羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开 题目分析:最大流最小割,建图方 ...
- 【bzoj】 1412: [ZJOI2009]狼和羊的故事
Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合 ...
- [bzoj1412][ZJOI2009]狼和羊的故事
bzoj100题啦 纪念一下. ----------------------------------------------------------------------------------- ...
最新文章
- web从零单排,做一个简单的幻灯片
- 2017计算机在线作业二,《计算机应用基础》2017年秋学期在线作业(二)满分答案...
- VS2008中vss的设置
- 13-Qt6 QMap
- PHP常见缓存技术分析(cache)
- mac电脑bash_profile创建,打开,编辑,保存
- C++ delete删除动态分配的内存
- 2021年中国成人商店市场趋势报告、技术动态创新及2027年市场预测
- 苹果修复严重的代码执行漏洞,影响 iOS 和 iPadOS 操作系统
- php 转发请求及参数,php – Symfony 2转发请求传递GET / POST参数
- php笔记:抽奖概率算法
- 项目管理工具maven的使用
- 【PHP8入门指南】基础语法与变量
- 基于Matlab的载波同步建模与仿真(科斯塔斯环)
- 富士康服务器主板维修,富士康865gv主板不跑码维修 - 主板知识
- FAST2022 DEPART: Replica Decoupling for Distributed Key-Value Storage Qiang(翻译分析)
- TIA portal v14怎么安装?
- 计算机二级改错题怎么分,计算机二级上机考(程序改错题)1.doc
- Autosar之自签名证书与CA证书
- 中考计算机考试不合格会怎么样,中考不及格会给毕业证吗 有什么后果吗