【BZOJ1001】狼抓兔子
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 7530 Solved: 1724
[Submit][Status]
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
HINT
Source
分析:根据题意很容易想到是(1,1)到(n,m)最大流,但最多会有10^6点,普通的会TLE。本屌丝当然也没招~~搜了题解,原来是2008周冬的集训队论文里提到的平面图的最大流——>最小割——>对偶图的最短路,于是可以最短路做,我用的是dijkstra+heap
题解:关于平面图的最大流详见周冬的论文(AH的oier呢好骄傲~~~),这里我只想提一下,根据平面图的定义,几乎所有最大流问题都可以这样做,当然前提是容易判断各个面,目前我见到的只是这种网格网络流,求大神分享其他的……
然后这题只剩建图了:大家自己在草稿纸画画就行了,我是将s点定为0,t点定为(n-1)*(m-1)*2+1(因为里面有(n-1)*(m-1)*2的三角形面),然后就是按顺序给里面的三角形编号,从左到右从上到下编号。然后有左边界或者下边界的连向s,有上边界或者右边界的连向t,中间的处理画画图谢谢式子就行了,具体看我程序
注意:1、建图的时候左下角会连2次s,右上角会连2次t,所以要判重,取两条边中最小的
2、特判m=1或n=1,ans是输入的数中的最小值
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=;
const int maxm=;
const int inf=;
struct heap
{
int d,u;
bool operator < (const heap& x) const
{
return d>x.d;
}
};
priority_queue<heap> q;
struct wjmzbmr
{
int to,data;
};
vector<wjmzbmr> g[(maxn-)*(maxm-)*+];
int n,m,d[(maxn-)*(maxm-)*+],f[(maxn-)*(maxm-)*+];
void ins(int a,int b,int w)
{
g[a].push_back({b,w});
g[b].push_back({a,w});
}
int main()
{ scanf("%d%d",&n,&m);
for(int i=;i<=(maxn-)*(maxm-)*+;++i) g[i].clear();
if(n==&&m==)
{
printf("");
return ;
}
if(n==)
{
int s=inf,x;
for(int i=;i<m;++i) scanf("%d",&x),s=min(s,x);
printf("%d",s);
return ;
}
if(m==)
{
int s=inf,x;
for(int i=;i<n;++i) scanf("%d",&x),s=min(s,x);
printf("%d",s);
return ;
}
int s=,t=(n-)*(m-)*+,a=inf,b=inf;
for(int i=;i<=n;++i)
for(int j=;j<m;++j)
{
int x;
scanf("%d",&x);
if(i==&&j==m-)
{
a=min(x,a);
continue;
}
if(i==n&&j==)
{
b=min(x,b);
continue;
}
if(i==) ins(j,t,x);
if(i==n) ins((n-)*(m-)*+m-+j,s,x);
if(i!=&&i!=n) ins(*(i-)*(m-)+m-+j,*(i-)*(m-)+j,x); }
for(int i=;i<=n-;++i)
for(int j=;j<=m;++j)
{
int x;
scanf("%d",&x);
if(i==&&j==m)
{
a=min(x,a);
continue;
}
if(i==n-&&j==)
{
b=min(x,b);
continue;
}
if(j==) ins(s,(i-)**(m-)+m,x);
if(j==m) ins(t,(i-)**(m-)+m-,x);
if(j!=&&j!=m) ins((i-)**(m-)+j-,(i-)**(m-)+m-+j,x);
}
for(int i=;i<=n-;++i)
for(int j=;j<=m-;++j)
{
int x;
scanf("%d",&x);
ins((i-)**(m-)+j,(i-)*(m-)*+m-+j,x);
}
ins(m-,t,a);ins(t-m+,,b);
memset(f,,sizeof(f));
for(int i=s;i<=t;++i) d[i]=inf;d[s]=;
while(!q.empty())q.pop();
q.push({,s});
while(!q.empty())
{
heap x=q.top();q.pop();
if(f[x.u]==) continue;
f[x.u]=;
for(int i=;i<g[x.u].size();++i)
if(d[x.u]+g[x.u][i].data<d[g[x.u][i].to])
{
d[g[x.u][i].to]=d[x.u]+g[x.u][i].data;
q.push({d[g[x.u][i].to],g[x.u][i].to});
}
}
printf("%d",d[t]);
return ;
}
【BZOJ1001】狼抓兔子的更多相关文章
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- bzoj1001狼抓兔子
1001: [BeiJing2006]狼抓兔子 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你 ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- BZOJ1001 狼抓兔子(裸网络流)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- 【建图+最短路】Bzoj1001 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- BZOJ1001 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
- 最大流最小割——bzoj1001狼抓兔子,洛谷P2598
前置知识 平面图 平面图就是平面上任意边都不相交的图.(自己瞎画的不算XD) 对偶图 比如说这个图,我们发现平面图肯定会把平面分成不同的区域(感觉像拓扑图),并把这些区域当做每个点(不被包围的区域独自 ...
- BZOJ1001 狼抓兔子
最小割 代码 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) m ...
- [BJOI2006][bzoj1001] 狼抓兔子 [最小割]
题面: 传送门 思路: 其实就是一道最小割的题目...... 我的写法加了两个优化,常数比较小,所以过掉了 一个是当前弧,一个是若当前点并不能流出去,那么标记dep为-1 听说正解是对偶图最短路?可以 ...
随机推荐
- iOS Build Active Architecture Only 属性的理解(及 not found for architecture i386 的解决方案)
最近做项目过程遇到一个问题: 涉及到这个属性:Build Active Architecture Only Yes .No的区别: 设置为yes,是只编译当前的architecture版本,是为了编译 ...
- CSS background-position 用法详细介绍
语法: background-position : length || length background-position : position || position 取值: length : ...
- [译] OpenStack Kilo 版本中 Neutron 的新变化
OpenStack Kilo 版本,OpenStack 这个开源项目的第11个版本,已经于2015年4月正式发布了.现在是个合适的时间来看看这个版本中Neutron到底发生了哪些变化了,以及引入了哪些 ...
- [转]backbone.js 初探
本文转自:http://weakfi.iteye.com/blog/1391990 什么是backbone backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架. 主要提供了 ...
- 《2016ThoughtWorks技术雷达峰会----雷达新趋势》
雷达新趋势 徐昊,ThoughtWorks中国区CTO 1.Open Source open source 已经从一个简简单单的软件代码组织方式变成一种文化,一种运动.当谈到Open Sour ...
- MIT 6.824 : Spring 2015 lab2 训练笔记
源代码参见我的github:https://github.com/YaoZengzeng/MIT-6.824 Lab 2:Primary/Backup Key/Value Service Overvi ...
- CTF中那些脑洞大开的加密(1)
0x01 目录 各种文本加密 Shell 1 2 3 4 5 6 7 8 9 10 11 12 换位加密: 1.栅栏密码(Rail-fence Cipher) ...
- 在移动端如何选择字体大小和布局的单位,px或dp?
android开发中,文字大小的单位是sp,非文字的尺寸单位用dp,但是我们在设计稿用的单位是px.这些单位如何换算,是设计师.开发者需要了解的关键. 简单理解的话,px(像素)是我们UI设计师在PS ...
- jquery工具方法parseJSON
error : 自定义错误 parseJSON : 字符串转json trim : 去除字符串头尾空字符 parseJSON方法先判断参数是否为字符串,否则返回空对象,再去除字符串头尾空字符,判断是否 ...
- Spring的反射机制和依赖注入
我们知道,Spring中大量使用了反射机制,那么究竟是什么地方使用了呢? spring的一大核心概念是注入, 但是,这存在的一个前提就是类是由spring管理起来的. 反射是根据className生成 ...