【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 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
随机推荐
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- bootstrap 入门
bootstrap 入门 <!DOCTYPE html> <html> <head lang="en"> <meta charset=&q ...
- CQRS及.NET中的参考资料
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:CQRS作为一种设计模式,其实一点都不新鲜了.不过今天有朋友感叹.NET朋友也关注CQ ...
- mac上创建MySQL的基本步骤
首先得安装环境与MySQL的软件 安装环境的软件在这里我用的是:jdk-8u111-macosx-x64.dmg MySQL:mysql-5.7.16-osx10.11-x86_64.dmg 安装好了 ...
- X64下MmIsAddressValid的逆向及内存寻址解析
标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com ...
- 全面解析windows下Memcache技术应用
原文 http://www.cnblogs.com/liuqin520/p/4615644.html 一.Memcache介绍 Memcache 是 danga.com 的一个项目,最早是为 L ...
- T-SQL 高级查询
基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 selec ...
- TextView展开和收回
第一步:接口请求返回数据 第二步:使用handler和textview.getLineCount方法判断是否超过指定行数: community_desc_more.setVisibility(View ...
- 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度
代码处理逻辑: 代码流程: 1.首先需要创建一个实体 用来存储 相关信息 package com.sxd.test.unusualName; public class NameEntity { pri ...
- 【hibernate merge】session1.merge(T entity)方法的含义和update方法的区别
注意: MERGE语句是SQL语句的一种.在SQL Server.Oracle数据库中可用,MySQL.PostgreSQL中不可用. 1>session1.merge(T entity) 合 ...