【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 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
随机推荐
- golang基础知识之encoding/json package
golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...
- js this的使用举例
js this的使用举例 <script type="text/javascript"> function test(obj){ obj.style.width= ob ...
- 7-11使用UNION合并查询
合并查询的语法: SELECT ...FROM 表名一 UNION SELECT ...FROM 表名二 合并查询的特点: 1: 合并表中的列的个数,数据类型数据类型相同或兼容. 2:UNION 默 ...
- hdu 4274 2012长春赛区网络赛 树形dp ***
设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...
- hdu 4272 2012长春赛区网络赛 dfs暴力 ***
总是T,以为要剪枝,后来发现加个map就行了 #include<cstdio> #include<iostream> #include<algorithm> #in ...
- AIX RAC ORA-27504 ORA-27300 ORA-27301 ORA-27302 ORA-27303
操作系统:AIX6.1 数据库:Oracle10.2.0.5 RAC 2个节点.其中一个节点正常,另外一个节点的instance的状态是offline的,手工去启动的时候报错: ORA: IPC e ...
- sql优化建议
背景: 在北京工作期间,我们做应用开发的和后台数据库的联系非常大,我们经常在一起讨论存储过程或者是sql性能优化的事情来降低应用运行时的时间,提高性能,经过和数据库方面的工程师的一些讨论 ...
- AJAX案例四:省市联动
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行
测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...
- BZOJ 2342 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...