Link:

BZOJ 1412 传送门

Solution:

非常明显的最小割模型:

将所有点分成两个互不相邻的点集,且要求代价最小

建图:

$<S,sheep,INF>$

$<wolf,T,INF>$

$<sheep,wolf/ground,1>$、$<ground,wolf/sheep/ground,1>$

Code:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int MAXN=,MAXM=,INF=<<;
  5. namespace Max_Flow
  6. {
  7. int head[MAXN],S,T,level[MAXN],iter[MAXN],tot=-;
  8. struct edge{int nxt,to,cap;}e[MAXM<<];
  9.  
  10. void add_edge(int from,int to,int cap)
  11. {
  12. e[++tot].nxt=head[from];e[tot].to=to;e[tot].cap=cap;head[from]=tot;
  13. e[++tot].nxt=head[to];e[tot].to=from;e[tot].cap=;head[to]=tot;
  14. }
  15. bool bfs()
  16. {
  17. memset(level,-,sizeof(level));
  18. queue<int> q;q.push(S);level[S]=;
  19. while(!q.empty())
  20. {
  21. int u=q.front();q.pop();
  22. for(int i=head[u];i!=-;i=e[i].nxt)
  23. if(e[i].cap && level[e[i].to]==-)
  24. level[e[i].to]=level[u]+,q.push(e[i].to);
  25. }
  26. return (level[T]!=-);
  27. }
  28. int dfs(int v,int f)
  29. {
  30. if(v==T) return f;
  31. int ret=;
  32. for(int &i=iter[v];i!=-;i=e[i].nxt)
  33. {
  34. if(level[e[i].to]==level[v]+ && e[i].cap)
  35. {
  36. int d=dfs(e[i].to,min(f,e[i].cap));
  37. e[i].cap-=d;e[i^].cap+=d;
  38. f-=d;ret+=d;if(!f) break;
  39. }
  40. }
  41. return ret;
  42. }
  43. int Dinic()
  44. {
  45. int ret=;
  46. while(bfs())
  47. {
  48. for(int i=;i<MAXN;i++) iter[i]=head[i];
  49. ret+=dfs(S,INF);
  50. }
  51. return ret;
  52. }
  53. }
  54.  
  55. int dx[]={,-,,},dy[]={,,,-};
  56. int n,m,dat[][];
  57.  
  58. int main()
  59. {
  60. using namespace Max_Flow;
  61. S=;T=;memset(head,-,sizeof(head));
  62. scanf("%d%d",&n,&m);
  63. for(int i=;i<=n;i++)
  64. for(int j=;j<=m;j++)
  65. scanf("%d",&dat[i][j]);
  66.  
  67. for(int i=;i<=n;i++)
  68. for(int j=;j<=m;j++)
  69. {
  70. if(dat[i][j]==) add_edge(S,(i-)*m+j,INF);
  71. if(dat[i][j]==){add_edge((i-)*m+j,T,INF);continue;}
  72. for(int k=;k<;k++)
  73. {
  74. int fx=i+dx[k],fy=j+dy[k];
  75. if(fx<||fx>n||fy<||fy>m) continue;
  76. if(dat[i][j]!= || dat[fx][fy]!=)
  77. add_edge((i-)*m+j,(fx-)*m+fy,);
  78. }
  79. }
  80. printf("%d",Dinic());
  81. return ;
  82. }

[BZOJ 1412] 狼与羊的故事的更多相关文章

  1. BZOJ 1412 狼和羊的故事

    首先,题目目的就是为了分割狼群和羊群,即建立超级源和超级汇求最小割从而转化成用网络流来处理. 如果没有空地,那么就是简单的二分图最大匹配,但是题中有空地的出现,所以需要在点与点之间建立双向边(不算后向 ...

  2. [BZOJ 1412][ZJOI 2009] 狼和羊的故事

    题目大意 有一个 (n times m) 的网格,每一个格子上是羊.狼.空地中的一种,羊和狼可以走上空地.现要在格子边上建立围栏,求把狼羊分离的最少围栏数. (1 leqslant n, ; m le ...

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

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

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

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

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

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

  6. 【BZOJ1412】狼和羊的故事(网络流)

    [BZOJ1412]狼和羊的故事(网络流) 题面 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...

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

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

  8. 洛谷 P2598 [ZJOI2009]狼和羊的故事 解题报告

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

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

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

随机推荐

  1. FluentAPI深入

    1.  HasMaxLenght 设定字段得最大长度: static void Main(string[] args) { using (TestDbContext ctx = new TestDbC ...

  2. HDU 3642 Get The Treasury ( 线段树 求长方体体积并 )

    求覆盖三次及其以上的长方体体积并. 这题跟 http://wenku.baidu.com/view/d6f309eb81c758f5f61f6722.html 这里讲的长方体体积并并不一样. 因为本题 ...

  3. PHP面向对象练习2

    思路:构造函数完成数据库连接,增删改一个方法,查询一条记录一个方法,查询多条一个方法,sql执行失败则返回提示,并交出sql语句方便查错 代码: <?class dbcontroll{ priv ...

  4. Codeforces Round #389 (Div. 2) 752F(树的权值重心)

    题目大意 给定2k个队伍分别住在2k个城市里,需要设定若干个城市,然后选取2个队伍要在它们的最短路径上设一个城市作为休息站 要求设立最少的休息站,然后输出如何安排2个队伍 首先若干个其实就是在坑人,实 ...

  5. Access-Control-Allow-Origin设置多个域名

    Access-Control-Allow-Origin只能返回一个. 所以用以下方法实现多个白名单域名:创建一个数据,获取请求中origin,如果在数组里,就返回该origin,如果不在,就返回一个默 ...

  6. Debian中文字体安装

    默认装的英文办的debian7,看中国字不太美,这好办照着做吧 1. Setup locales #dpkg-reconfigure locales 选择 zh_CN GB2312 zh_CN.GBK ...

  7. 转:ListView中getView的工作原理

    ListView中getView的工作原理: [1]ListView asks adapter “give me a view” (getView) for each item of the list ...

  8. JQuery实现多个菜单的显示隐藏

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) 效果图: 点击各个菜单显示/隐藏,以及点击灰色部分隐藏. 比如点击了第一个菜单,然后点击第二个菜单,第一个菜单会隐藏,再显示第二个菜单,不会叠加. ...

  9. cp2102通过GPIO连接树莓派

    此博客不在更新,我的博客新地址:www.liuquanhao.com ----------------------------------------------------------------- ...

  10. 使用MyQR生成二维码

    from MyQR import myqr # 主要用到以下几个参数 # words:文本,可以是一个链接,或者你想说的话 # picture:你用到的图片,作为背景,不然只是一个光秃秃的二维码 # ...