【BZOJ1001】【BeiJing2006】狼抓兔子 最大流
Description
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:
左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.
Input
第一行为N,M.表示网格的大小,N,M均小于等于1000.接下来分三部分第一部分共N行,每行M-1个数,表示横向道路的权值. 第二部分共N-1行,每行M个数,表示纵向道路的权值. 第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 输入文件保证不超过10M
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
Solution:记得第一次看时觉得炒鸡高大上,其实现在也是,因为我并不会平面图转对偶图,一开始感觉就是裸的最大流,然而加当前弧优化后跑不粗来,估计写惨了,看了黄学长的blog用了某种优化后才A了,传—送—门
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#define N 1000000
#define inf 0x7fffffff
using namespace std; struct data{int next,point,v;}e[*N+];
int cur[N+],deep[N+],head[*N+],q[N+];
int tn,n,m,ans; inline int get()
{
char c;int anss=;
while ((c=getchar())==' ' || c=='\n' || c=='\r');
anss=c-'';
while (isdigit(c=getchar())) anss=anss*+c-'';
return anss;
} inline bool bfs(int s,int t)
{
memset(deep,-,sizeof(deep));
// for (int i=0;i<=n;i++) cur[i]=head[i];
deep[s]=;
int tt=,w=;
q[tt]=s;
while (tt<w)
{
int now=q[tt]; tt++;
for (int tn=head[now];tn!=-;tn=e[tn].next)
if (deep[e[tn].point]==- && e[tn].v)
deep[e[tn].point]=deep[now]+,q[w++]=e[tn].point;
}
if (deep[t]==-) return ;
return ;
} int dfs(int now,int t,int limit)
{
if (!limit || now==t) return limit;
int flow=,f,used=;
for (int tn=head[now];tn!=-;tn=e[tn].next)
{
//cur[now]=tn;
if (deep[e[tn].point]==deep[now]+ && e[tn].v)
{
f=limit-used;
f=dfs(e[tn].point,t,min(e[tn].v,f));
used+=f;
e[tn].v-=f;
e[tn^].v+=f;
if (used==limit) return limit;
}
}
if (!used) deep[now]=-;
return used;
} void se(int x,int y,int w)
{
tn++; e[tn].next=head[x]; head[x]=tn; e[tn].point=y; e[tn].v=w;
tn++; e[tn].next=head[y]; head[y]=tn; e[tn].point=x; e[tn].v=w;
} void dinic(int s,int t)
{
while (bfs(s,t)) ans+=dfs(s,t,inf);
} int main()
{
//freopen("bjrabbit.in","r",stdin);
//freopen("bjrabbit.out","w",stdout);
int w;
tn=-;
memset(e,-,sizeof(e));
memset(head,-,sizeof(head));
n=get(); m=get();
for (int i=;i<=n;i++)
for(int j=;j<m;j++)
w=get(),se(m*(i-)+j,m*(i-)+j+,w);
for (int i=;i<n;i++)
for (int j=;j<=m;j++)
w=get(),se(m*(i-)+j,m*i+j,w);
for (int i=;i<n;i++)
for (int j=;j<m;j++)
w=get(),se(m*(i-)+j,m*i+j+,w);
dinic(,n*m);
printf("%d\n",ans);
return ;
}
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
Source
【BZOJ1001】【BeiJing2006】狼抓兔子 最大流的更多相关文章
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- bzoj1001: [BeiJing2006]狼抓兔子(初识是你最小割)
1001: [BeiJing2006]狼抓兔子 题目:传送门 题解: 听说这题当初是大难题...可惜当年没有网络流hahahha 现在用网络流的思想就很容易解决了嘛 给什么连什么,注意是双向边,然后跑 ...
- BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 30078 Solved: 7908[Submit][ ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
- BZOJ1001: [BeiJing2006]狼抓兔子【最短路+对偶图】
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Se ...
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- [BZOJ1001] [Beijing2006] 狼抓兔子 (最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
随机推荐
- ASP.NET 客户端静态文件请求设置缓存(Client Cache)
通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存 ...
- git 打标签并推送tag到托管服务器
我们常常在代码封板时,使用git 创建一个tag ,这样一个不可修改的历史代码版本就像被我们封存起来一样,不论是运维发布拉取,或者以后的代码版本管理,都是十分方便的. 首先我们了解下 git 的 ta ...
- <转>FreeMarker内置函数
一. Sequence的内置函数1. sequence?first 返回sequence的第一个值.2. sequence?last 返回sequence的最后一个值.3. sequence?reve ...
- 【leetcode】Reverse Words in a String
今天第一次在leetcode上提交了一个题目,据说这个网站基本上都是名企面试笔试题,今天无意一进去就看到第一题居然就是昨天的腾讯实习生笔试题,赶紧注册了个账号做题. 题目描述: Given an in ...
- [Eclipse] Eclipse配置Tomcat插件
1 . Eclipse IDE 3.6 for Java EE Developersat- 5.5.28 或者以上版本 : 2 . 安装 Tomcat 插件 , 文件名: tomcatPluginV3 ...
- URAL 1966 Cycling Roads 点在线段上、线段是否相交、并查集
F - Cycling Roads Description When Vova was in Shenzhen, he rented a bike and spent most of the ...
- LoadRunner 脚本学习 -- 指针基础
先搞清楚 ++a 和 a++的区别 ++a : 前缀++, 先自增,后表达式 a++ : 后缀++, 先表达式,后自增 前缀,自增立即生效. 后缀,下次才会看到效果. 一维数组的指针 Action ...
- 【JavaScript】变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级
参考资料http://caibaojian.com/toutiao/5446 1.所有变量声明(var)或者声明函数都会被提升到当前函数顶部 关于函数表达式,js会将代码拆分为两行代码分别执行.这里需 ...
- jquery尺寸:宽度与高度
width() 方法设置或返回元素的宽度(不包括内边距.边框或外边距). height() 方法设置或返回元素的高度(不包括内边距.边框或外边距). innerWidth() 方法返回元素的宽度(包括 ...
- css:删除:×的效果
常常要使用的显示删除效果: DEMO