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

3 4
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

14

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】狼抓兔子的更多相关文章

  1. bzoj1001狼抓兔子 对偶图优化

    bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...

  2. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  3. bzoj1001狼抓兔子

    1001: [BeiJing2006]狼抓兔子 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你 ...

  4. BZOJ1001:狼抓兔子(最小割最大流+vector模板)

    1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...

  5. BZOJ1001 狼抓兔子(裸网络流)

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  6. 【建图+最短路】Bzoj1001 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  7. BZOJ1001 狼抓兔子 平面图转对偶图 最小割

    现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...

  8. 最大流最小割——bzoj1001狼抓兔子,洛谷P2598

    前置知识 平面图 平面图就是平面上任意边都不相交的图.(自己瞎画的不算XD) 对偶图 比如说这个图,我们发现平面图肯定会把平面分成不同的区域(感觉像拓扑图),并把这些区域当做每个点(不被包围的区域独自 ...

  9. BZOJ1001 狼抓兔子

    最小割 代码 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) m ...

  10. [BJOI2006][bzoj1001] 狼抓兔子 [最小割]

    题面: 传送门 思路: 其实就是一道最小割的题目...... 我的写法加了两个优化,常数比较小,所以过掉了 一个是当前弧,一个是若当前点并不能流出去,那么标记dep为-1 听说正解是对偶图最短路?可以 ...

随机推荐

  1. file

    用来测试文件类型 $file [] filename -b列出辨识结果时,但不显示文件名称 -L如果文件是符号链接,那么直接解读其指向的文件 -z:如果文件是压缩文件,尝试去解读压缩文件的内容 $fi ...

  2. 自定义SeekBar的使用

    一.seekbar是进度条,可以使用系统的,也可以自己定义,下面我们将自己定义一个seekbar. 1.自定义滑条,包括对背景,第一进度,第二进度的设置,通过一个xml来实现,在drawable下创建 ...

  3. android-The method findViewById(int) is undefined for the type ContactMainFragment报错

    @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view ...

  4. no CONFIG_BQL

    [PATCH] net: make CONFIG_BQL actually end user configurable Without the defining string or help text ...

  5. STM32学习笔记——USART串口

    转载自:http://www.cnblogs.com/microxiami/p/3752715.html 一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异 ...

  6. 代理模式 vs 装饰模式

    代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的.下面分别讲解代理模式和装饰模式. 1.代理模式 一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理 ...

  7. HOLOLENS如何调节屏幕亮度和音量?

    圆环左边的两个是亮度按键,右边的是两个音量按键,值得注意的是,无论是两个音量键还是亮度键,它们都被设置成了一凸一凹,凸的按键为音量/亮度+键,凹为-键,其工业设计可见一斑.

  8. BeanShell Assertion in Jmeter

    以下为几个beanshell assertion的栗子: if (ResponseCode != null && ResponseCode.equals ("200" ...

  9. ThreadLocal用法和实现原理

    如果你定义了一个单实例的java bean,它有若干属性,但是有一个属性不是线程安全的,比如说HashMap.并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在跨线程的意义.那么你不 ...

  10. JavaScript 各种页面跳转方法

    第一种: window.location.href="login.jsp?backurl=\"+window.location.href; 第二种: alert("返回& ...