题目戳我

\(\text{Solution:}\)

显然思路,把所有羊看成一个源点,所有狼看成一个汇点,格子之间连容量为\(1\)的边,直接跑最小割。

技巧:

  • 注意到篱笆不能把羊给割掉,狼同理。所以,我们可以建立一个超级源点\(S\)向所有羊连一条容量为\(inf\)的边。这样,在最小割中就一定不会把这条边割掉。对狼的处理同样。

  • 对每个格子编号:想象成一张表格,对于点\((i,j)\)则前面已经经过了\(m(i-1)\)个格子,当前这个格子是第\(i\)行的第\(j\)个,于是它的编号应该是\((i-1)*m+j.\)不要写反!!!!!!

这题收获:注意到无限边在最小割中特殊的意义。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int MAXN=5e5+10;
  5. const int inf=1e15;
  6. int n,m,dep[MAXN],cur[MAXN],head[MAXN],tot=1,S,T;
  7. struct edge{
  8. int nxt,to,flow;
  9. }e[MAXN];
  10. inline void add(int x,int y,int w){
  11. e[++tot].to=y;
  12. e[tot].nxt=head[x];
  13. head[x]=tot;e[tot].flow=w;
  14. e[++tot].to=x;
  15. e[tot].nxt=head[y];
  16. head[y]=tot;e[tot].flow=0;
  17. }
  18. bool bfs(int s,int t){
  19. memset(dep,0,sizeof(dep));
  20. queue<int>q;q.push(s);
  21. cur[s]=head[s];dep[s]=1;
  22. while(!q.empty()){
  23. s=q.front();q.pop();
  24. for(int i=head[s];i;i=e[i].nxt){
  25. int j=e[i].to;
  26. if(!dep[j]&&e[i].flow){
  27. dep[j]=dep[s]+1;
  28. cur[j]=head[j];
  29. if(j==t)return true;
  30. q.push(j);
  31. }
  32. }
  33. }
  34. return false;
  35. }
  36. int dfs(int s,int flow,int t){
  37. if(s==t||flow<=0)return flow;
  38. int rest=flow;
  39. for(int i=cur[s];i;i=e[i].nxt){
  40. int j=e[i].to;
  41. if(dep[j]==dep[s]+1&&e[i].flow){
  42. int tmp=dfs(j,min(rest,e[i].flow),t);
  43. if(tmp<=0)dep[j]=0;
  44. rest-=tmp;e[i].flow-=tmp;e[i^1].flow+=tmp;
  45. if(rest<=0)break;
  46. }
  47. }
  48. return flow-rest;
  49. }
  50. int dinic(int s,int t){
  51. int ans=0;
  52. for(;bfs(s,t);)ans+=dfs(s,inf,t);
  53. return ans;
  54. }
  55. inline int num(int x,int y){return (x-1)*m+y;}
  56. signed main(){
  57. scanf("%lld%lld",&n,&m);
  58. S=0,T=num(n,m)+1;
  59. for(int i=1;i<=n;++i){
  60. for(int j=1;j<=m;++j){
  61. int pos=num(i,j);
  62. int x;scanf("%lld",&x);
  63. if(!x)continue;
  64. if(x==1)add(S,pos,inf);
  65. if(x==2)add(pos,T,inf);
  66. }
  67. }
  68. for(int i=1;i<=n;++i){
  69. for(int j=1;j<=m;++j){
  70. if(i-1>0)add(num(i,j),num(i-1,j),1);
  71. if(j-1>0)add(num(i,j),num(i,j-1),1);
  72. if(i+1<=n)add(num(i,j),num(i+1,j),1);
  73. if(j+1<=m)add(num(i,j),num(i,j+1),1);
  74. }
  75. }
  76. printf("%lld\n",dinic(S,T));
  77. return 0;
  78. }

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

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

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

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

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

  3. 嘴巴题3 「BZOJ1412」[ZJOI2009] 狼和羊的故事

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. P2598 [ZJOI2009]狼和羊的故事(最小割)

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

随机推荐

  1. 面试【JAVA基础】类加载机制

    1.类加载过程 1.1.加载 查找和导入class文件. 1.2.链接 验证 检验载入的class文件的正确性,完整性. 准备 给类的静态变量分配存储空间,会赋对象类型的默认值. 解析 将class常 ...

  2. Codeforces 1321E World of Darkraft: Battle for Azathoth

    题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...

  3. 记录一道有意思的js题目

    偶然机会,在codewars上面开始做题,遇到一道有意思的题目,记录一下: 题目是这样的: In this kata, you will write a function that returns t ...

  4. Istio 的配置分析

    Istio 的配置分析 目录 Istio 的配置分析 Analyzer 的消息格式 ConflictingMeshGatewayVirtualServiceHosts 问题解决 举例 Conflict ...

  5. 小程序开发-微信小程序开发入门

    分享一个微信小程序开发的基本流程,仅供参考. 第一步:注册微信小程序公众号,注册成功后,登录微信公众号管理后台,等待下一步操作. 第二步:进入微信小程序的后台后,下载微信内置的微信小程序开发者工具,以 ...

  6. nginx 启动报错“var/run/nginx/nginx.pid" no such file or directory

    nginx 启动报错“var/run/nginx/nginx.pid" no such file or directory 今天刚搭建的nginx服务器启动时,报错“var/run/ngin ...

  7. 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练

    以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...

  8. Eclipse插件打开编辑器

    今天终于可以闲一天,想来想去就乱写点东西吧,说不定对有些新人有点帮助呢-_- 用Eclipse API的方式来打开编辑器,可能对任何一个插件开发者都不是很陌生的操作了.但是,还是建议你忍着看一下,全当 ...

  9. CentOS 7 安装部署 cassandra作为kairosdb的数据存储

    环境 Centos 7.4 java 1.8.0 安装步骤 java yum -y install java-1.8.0-openjdk* cassandra wget https://mirrors ...

  10. python基础:日志模块logging,nnlog

    python里面用来打印日志的模块,就是logging模块,logging模块可以在控制台打印日志,也可以写入文件中.也可以两个操作都执行 1.控制台输入 import logging#导入模块 lo ...