bzoj1412[ZJOI2009]狼和羊的故事

题意:
n*m网格,每个格子可能为狼、羊或空格。现在要在一些格子边界篱笆使羊狼分开,求最短篱笆。n,m≤100
题解:

最小割问题,建一个超级源和超级汇,然后从源点向每只羊之间连边,容量为正无穷;每只狼向汇点连边,容量为正无穷,相邻格子之间连边,容量为1,再跑一次最大流就是结果。因为每一条同时经过羊和狼的路径都需要堵住,但又不能堵连向源点和汇点的边,所以堵住的边必定是将羊和狼分隔开的边。

dicnic:求解网络流的一种算法:先用bfs构建层次图,然后用dfs沿着层次增广,当dfs无法增广时再重复上述过程,知道源点和汇点不连通。速度比传统的EK法要快得多,但比ISAP慢,因为ISAP无法增广时是直接修改层次,同时还能用gap优化,但dicnic很好写,简洁易懂。CZL大爷说dicnic在计算本来就有一定层次的图(如二分图)时速度快,ISAP在计算一般图速度快,涨姿势了!

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 #define INF 0xfffffff
 6 #define g(b) g[b.x][b.y]
 7 #define h(b) h[b.x][b.y]
 8 #define maxn 110
 9 #define inc(i,j,k) for(int i=j;i<=k;i++)
10 using namespace std;
11
12 //edge
13 struct p{int x,y;}; struct e{p t;int c,n;}; e es[200000*2]; int ess,g[maxn][maxn];
14 void pe(p f,p t,int c){
15     es[++ess]=(e){t,c,g(f)}; g(f)=ess;
16     es[++ess]=(e){f,0,g(t)}; g(t)=ess;
17 }
18
19 //maxflow
20 queue <p> q; int h[maxn][maxn];
21 bool bfs(p s,p t){//构建层次图
22     while(! q.empty())q.pop(); memset(h,-1,sizeof(h)); h(s)=0; q.push(s);
23     while(! q.empty()){
24         p now=q.front(); q.pop();
25         for(int i=g(now);i!=-1;i=es[i].n)if(h(es[i].t)==-1&&es[i].c>0){
26             h(es[i].t)=h(now)+1; q.push(es[i].t);
27         }
28     }
29     return (h(t)==-1)?0:1;
30 }
31 int dfs(p x,p t,int flow){//找增广路并增广
32     if(x.x==t.x&&x.y==t.y)return flow;
33     int used=0;
34     for(int i=g(x);i!=-1;i=es[i].n)if(es[i].c>0&&h(es[i].t)==h(x)+1){
35         int w=dfs(es[i].t,t,min(flow,es[i].c));
36         es[i].c-=w; es[i^1].c+=w; used+=w; flow-=w; if(flow==0)return used;
37     }
38     if(! used)h(x)=-1; return used;
39 }
40 int dicnic(p s,p t){int flow=0; while(bfs(s,t))flow+=dfs(s,t,INF); return flow;}
41
42 //main
43 int n,m,graph[maxn][maxn];
44 int main(){
45     //freopen("zs.txt","r",stdin);
46     scanf("%d%d",&n,&m);
47     inc(i,1,n)inc(j,1,m)scanf("%d",&graph[i][j]);
48     memset(g,-1,sizeof(g)); ess=-1;
49     inc(i,1,n)inc(j,1,m){
50         if(graph[i][j]==2)pe((p){0,0},(p){i,j},INF);
51         if(graph[i][j]==1)pe((p){i,j},(p){n+1,m+1},INF);
52         if(i-1>0)pe((p){i,j},(p){i-1,j},1);
53         if(i+1<=n)pe((p){i,j},(p){i+1,j},1);
54         if(j-1>0)pe((p){i,j},(p){i,j-1},1);
55         if(j+1<=m)pe((p){i,j},(p){i,j+1},1);
56     }
57     printf("%d",dicnic((p){0,0},(p){n+1,m+1}));
58     return 0;
59 }

20160102

转载于:https://www.cnblogs.com/YuanZiming/p/5094166.html

bzoj1412[ZJOI2009]狼和羊的故事相关推荐

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

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

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

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

  3. BZOJ1412: [ZJOI2009]狼和羊的故事

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

  4. bzoj1412: [ZJOI2009]狼和羊的故事(最小割)

    传送门 首先,考虑只有狼和羊怎么办.我们把源点向所有羊连边,容$inf$,所有狼向汇点连边,容$inf$,然后羊向周围所有的狼连边,容$1$.那么,只要求一个割就能把狼和羊给分开,求一个最小割就是答案 ...

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

    题目描述 传送门 题解 首先建立源汇,对于每一个为1的点s->i,对于每一个为2的点i->t,然后每个点向它的四周连边. 这样做的原因是无论如何狼和羊不能通过任何道路连通. 最小割即为答案 ...

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

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

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

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

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

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

  9. [bzoj1934]: [ZJOI2009]狼和羊的故事

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

最新文章

  1. 新员工安全生产知识学习读本
  2. ZooKeeper概述与原理
  3. Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例
  4. boost::multi_array模块确保 multi_arrays 与 STL 容器一起使用
  5. Java源码阅读PriorityQueue
  6. 第十一章:可绑定的基础结构(四)
  7. 【多线程】线程的生命周期
  8. 微信团购小程序怎么做?一般要多少钱?
  9. python app开发框架_Python可以开发APP吗?用哪个框架?
  10. 0x8000FFFF(0X8000FFFF,WPS)
  11. 统一社会信用代码正则校验
  12. tf.contrib.silm学习
  13. mediasoup 管道通信类UnixStreamSocket分析
  14. 优化css性能有哪些方法?
  15. 【CSAPP】计算机系统知识点(新国立NUS课程,中文版)
  16. requireJS define require
  17. 【渝粤题库】陕西师范大学201421 公司法作业
  18. 关于电视机中DTV码流对android的Timer的影响
  19. 雅思计算机基础题及答案,雅思写作大作文真题及参考范文:玩电脑对孩子有益?...
  20. 学生信息的那些操作:按姓名,查个人

热门文章

  1. oracle空格转换函数,ORACLE TO_CHAR函数格式化数字的出现空格的缘故
  2. LeetCode Partition Equal Subset Sum(动态规划)
  3. HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)
  4. .Net 3.5新特性(1)Automatic Properties, Object Initializers, and Collection Initializers
  5. Mysql的性能优化
  6. 配置hadoop集群,完全分布式模式
  7. 数据分析进阶 数据质量
  8. 【Spring-web】RestTemplate源码学习——梳理内部实现过程
  9. SQL compute by 的使用
  10. 开发者必备的15 个Web开发工具