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

 
又是网络流,有没建出模型来……
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<iostream>
  5. using namespace std;
  6. const int inf=,N=;
  7. int fx[]={,,,-},fy[]={,-,,};
  8. struct ee{int to,next,f;}e[];
  9. int head[N*N],q[N**N],dis[N*N],a[N][N];
  10. int S,T,n,m,cnt=,ans,w;
  11.  
  12. void ins(int u,int v,int f){
  13. e[++cnt].to=v;e[cnt].f=f;e[cnt].next=head[u];head[u]=cnt;
  14. e[++cnt].to=u;e[cnt].f=;e[cnt].next=head[v];head[v]=cnt;
  15. }
  16.  
  17. bool bfs(){
  18. for (int i=;i<=T;i++) dis[i]=inf;
  19. int h=,t=,now;
  20. q[]=S;dis[S]=;
  21. while(h!=t){
  22. now=q[++h];
  23. for (int i=head[now];i;i=e[i].next){
  24. int v=e[i].to;
  25. if (e[i].f&&dis[now]+<dis[v]){
  26. dis[v]=dis[now]+;
  27. if (v==T)return ;
  28. q[++t]=v;
  29. }
  30. }
  31. }
  32. if (dis[T]==inf) return ; return ;
  33. }
  34.  
  35. int dinic(int now,int f){
  36. if (now==T) return f;
  37. int rest=f;
  38. for (int i=head[now];i;i=e[i].next){
  39. int v=e[i].to;
  40. if (e[i].f&&dis[v]==dis[now]+&&rest){
  41. int t=dinic(v,min(rest,e[i].f));
  42. if (!t) dis[v]=;
  43. e[i].f-=t;
  44. e[i^].f+=t;
  45. rest-=t;
  46. //if(t) printf("%d %d %d\n",now,v,e[i].f);
  47. }
  48. }
  49. return f-rest;
  50. }
  51. int main(){
  52. scanf("%d%d",&n,&m);
  53. S=,T=n*m+;
  54. for(int i=;i<=n;i++)
  55. for(int j=;j<=m;j++)
  56. scanf("%d",&a[i][j]);
  57. for(int i=;i<=n;i++) for(int j=;j<=m;j++)
  58. if(a[i][j]==) ins(S,(i-)*m+j,inf);
  59. for(int i=;i<=n;i++) for(int j=;j<=m;j++)
  60. if(a[i][j]==) ins((i-)*m+j,T,inf);
  61. for(int i=;i<=n;i++) for(int j=;j<=m;j++){
  62. if(a[i][j]==) {
  63. for(int ii=;ii<;ii++) {
  64. int nx=i+fx[ii],ny=j+fy[ii];
  65. if(nx>n||nx<||ny>m||ny<||a[nx][ny]==) continue;
  66. ins((i-)*m+j,(nx-)*m+ny,);
  67. }
  68. }
  69. else if(a[i][j]==){
  70. for(int ii=;ii<;ii++) {
  71. int nx=i+fx[ii],ny=j+fy[ii];
  72. if(nx>n||nx<||ny>m||ny<||a[nx][ny]==) continue;
  73. ins((i-)*m+j,(nx-)*m+ny,);
  74. }
  75. }
  76. }
  77. while(bfs())
  78. ans+=dinic(S,inf);
  79. printf("%d",ans);
  80. }

【BZOJ 1412】[ZJOI2009]狼和羊的故事的更多相关文章

  1. BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )

    显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了 -------------------------------------------------------- ...

  2. BZOJ 1412: [ZJOI2009]狼和羊的故事【网络流】

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

  3. bzoj 1412 [ZJOI2009]狼和羊的故事(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题意] 在一个n*m的格子中,将羊和狼隔开的最小代价. [思路] 最小割. 由 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1412 超级源点连向所有的狼,超级汇点连向所有羊,流量为INF 相邻连边流量为1,最小割 #inclu ...

  5. BZOJ 1412 [ZJOI2009]狼和羊的故事 | 网络流

    显然是个最小割嘛! 一开始我是这么建图的: 源点向狼连INF 羊向汇点连INF 每两个相邻格子间连双向边,边权为1 然后T成狗 后来我是这么建图的: 源点向狼连INF 羊向汇点连INF 狼和空地向相邻 ...

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

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

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

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4017  Solved: 2037[Submit][Status][Discuss] Descript ...

  8. bzoj1412: [ZJOI2009]狼和羊的故事

    空地之间开始没有连然后一直WA...题意混乱...尴尬. #include<cstdio> #include<cstring> #include<iostream> ...

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

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

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

    P2598 [ZJOI2009]狼和羊的故事 源点和所有狼连 $inf$ 的边 所有羊和汇点连 $inf$ 的边 所有点向四周连 $1$ 的边 这样所有狼和羊之间的边都被割掉了 统计最小割就好辣 #i ...

随机推荐

  1. 怎么在html页面和js里判断是否是IE浏览器

    HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...

  2. [改善Java代码]断言绝对不是鸡肋

    建议19: 断言绝对不是鸡肋 在防御式编程中经常会用断言(Assertion)对参数和环境做出判断,避免程序因不当的输入或错误的环境而产生逻辑异常,断言在很多语言中都存在,C.C++.Python都有 ...

  3. MSP430常见问题之通信类

    Q1: 430 串口中,有个R/D 控制线,在接收上位机的数据,但本身的数据有无发送完毕不知道啊,什么时候才可置低R/d 位来接收数据啊?好像430 没有发送完中断标志A1:字节主动发送,一般都能发出 ...

  4. 【AngularJs】---表单验证

    1. 必填项 验证某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required /> 2 ...

  5. 导出Private API

    首先介绍下private API 它共分为两类: 1 在官方文档中没有呈现的API(在frameworks 下隐藏) 2 苹果明确申明不能使用的API ,在privateFrameworks 下 然后 ...

  6. (转载)Nim游戏博弈(收集完全版)

    Nim游戏的概述: 还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输.后来,在一份资料上看到,这种游戏称为“拈(Nim)”.据说,它源 ...

  7. Ajax-Demo

    index.jsp 1 <%@ page language="java" contentType="text/html; charset=UTF-8" p ...

  8. Sql Server Profiler跟踪死锁

    Sql Server Profiler一个很重要的应用场景就是监视分析死锁. 下面通过一个例子来学习Profiler是如何监视死锁的. 1. 创建测试数据模拟死锁, 创建表Table_A和Table_ ...

  9. windows server 2008下装SQL 2008R2x64

    1. 在windows server 2008下装SQL 2008出现 This SQL Server Setup media is not supported on a X64 system 使用虚 ...

  10. st_mode 的位定义

    先前所描述的st_mode 则定义了下列数种情况: S_IFMT 0170000 文件类型的位遮罩 S_IFSOCK 0140000 scoket S_IFLNK 0120000 符号连接 S_IFR ...