1412: [ZJOI2009]狼和羊的故事

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3105  Solved: 1567
[Submit][Status][Discuss]

Description

“狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆。可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已。所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养。 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非常暴躁,不利于他们的成长。 Orez想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地,再就是篱笆必须修筑完整,也就是说必须修建在单位格子的边界上并且不能只修建一部分。

Input

文件的第一行包含两个整数n和m。接下来n行每行m个整数,1表示该格子属于狼的领地,2表示属于羊的领地,0表示该格子不是任何一只动物的领地。

Output

文件中仅包含一个整数ans,代表篱笆的最短长度。

Sample Input

2 2
2 2
1 1

Sample Output

2

数据范围
10%的数据 n,m≤3
30%的数据 n,m≤20
100%的数据 n,m≤100

HINT

Source

题解

最小割的定义是:

编辑

割:设Ci为网络N中一些弧的集合,若从N中删去Ci中的所有弧能使得从源点Vs到汇点Vt的路集为空集时,称Ci为Vs和Vt间的一个割。通俗理解,一个图或网络的割,表示一个切面或切线,将图或网络分为分别包含源点和漏点的两个子集,该切线或切面与网络相交的楞或边的集合,称为图像的割。

最小割

编辑

最小割:图中所有的割中,边权值和最小的割为最小割。

那么此题要求狼和样不连通 实质上就是求最小割 使源点和汇点不连通

那么就把源点连所有狼 汇点连所有羊(反过来应该也可以)

然后再把每个点和四个周围的点连起来 求个最小割=最大流 就行了

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]狼和羊的故事相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    bzoj100题啦  纪念一下. ----------------------------------------------------------------------------------- ...

最新文章

  1. web从零单排,做一个简单的幻灯片
  2. 2017计算机在线作业二,《计算机应用基础》2017年秋学期在线作业(二)满分答案...
  3. VS2008中vss的设置
  4. 13-Qt6 QMap
  5. PHP常见缓存技术分析(cache)
  6. mac电脑bash_profile创建,打开,编辑,保存
  7. C++ delete删除动态分配的内存
  8. 2021年中国成人商店市场趋势报告、技术动态创新及2027年市场预测
  9. 苹果修复严重的代码执行漏洞,影响 iOS 和 iPadOS 操作系统
  10. php 转发请求及参数,php – Symfony 2转发请求传递GET / POST参数
  11. php笔记:抽奖概率算法
  12. 项目管理工具maven的使用
  13. 【PHP8入门指南】基础语法与变量
  14. 基于Matlab的载波同步建模与仿真(科斯塔斯环)
  15. 富士康服务器主板维修,富士康865gv主板不跑码维修 - 主板知识
  16. FAST2022 DEPART: Replica Decoupling for Distributed Key-Value Storage Qiang(翻译分析)
  17. TIA portal v14怎么安装?
  18. 计算机二级改错题怎么分,计算机二级上机考(程序改错题)1.doc
  19. Autosar之自签名证书与CA证书
  20. 中考计算机考试不合格会怎么样,中考不及格会给毕业证吗 有什么后果吗

热门文章

  1. 四个数排序C++语言
  2. elastic stack 基础组件beats详解
  3. 跟着我从零开始入门FPGA(一周入门系列)第二天
  4. python如何打开服务器文件大小,关于字符串:Python可以打开的文件的最大大小?...
  5. chrome github加速器
  6. 回顾2019年度京东集团10件大事:不忘初心,坚定前行
  7. 外媒称中国现行社保制度劫贫济富
  8. 伙伴系统之伙伴系统概述--Linux内存管理(十五)
  9. 走亲访友(并查集的应用)
  10. 深度剖析 —— 文件操作