1001: [BeiJing2006]狼抓兔子

现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,

而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:

左上角点为(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只狼,

才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的

狼的数量要最小。因为狼还要去找喜羊羊麻烦.

对偶图的第一题。

平面图的对偶图是把平面图的面变成点,外面的部分变为一个点。

如果要求一个平面图的最大流,我们可以把它转化为它对偶图的最短路。

#include<bits/stdc++.h>
using namespace std;
#define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
#define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
#define id(x,y) ((x-1)*m+y)
typedef long long ll;
inline int read(){
int x;
char c;
int f=1;
while((c=getchar())!='-' && (c<'0' || c>'9'));
if(c=='-') c=getchar(),f=-1;
x=c^'0';
while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
return x*f;
}
inline ll readll(){
ll x;
char c;
ll f=1;
while((c=getchar())!='-' && (c<'0' || c>'9'));
if(c=='-') c=getchar(),f=-1;
x=c^'0';
while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
return x*f;
}
const int maxn=2000000+10,inf=0x3f3f3f3f;
int Begin[maxn],Next[maxn*3],to[maxn*3],w[maxn*3],e;
inline bool chkmin(int &x,int y){return (y<x)?(x=y,1):0;}
void add_edge(int x,int y,int z){
to[++e]=y;
Next[e]=Begin[x];
Begin[x]=e;
w[e]=z;
}
void add(int x,int y){
int z=read();
add_edge(x,y,z),add_edge(y,x,z);
}
struct point{
int x,y;
bool operator <(const point &rhs) const{
return y>rhs.y;
}
};
priority_queue<point> q;
bool vis[maxn];
int d[maxn];
int S,T;
int main(){
#ifndef ONLINE_JUDGE
freopen("dot.in","r",stdin);
freopen("dot.out","w",stdout);
#endif
int n=read(),m=read();
if(n==1 || m==1){
if(n>m) swap(n,m);
int ans=inf;
REP(i,1,m-1){
int x=read();
chkmin(ans,x);
}
if(ans==inf) printf("0\n");
else printf("%d\n",ans);
return 0;
}
n--,m--;
S=n*m*2+1,T=n*m*2+2;
REP(i,1,m) add(S,id(1,i)*2-1);
REP(i,2,n) REP(j,1,m) add(id(i-1,j)*2,id(i,j)*2-1);
REP(i,1,m) add(id(n,i)*2,T);
REP(i,1,n)
REP(j,1,m+1){
if(j==1) add(id(i,j)*2,T);
else if(j==jend) add(S,id(i,j-1)*2-1);
else add(id(i,j)*2,id(i,j-1)*2-1);
}
REP(i,1,n) REP(j,1,m) add(id(i,j)*2-1,id(i,j)*2);
memset(d,inf,sizeof(d));
q.push((point){S,0});d[S]=0;
while(!q.empty()){
point u=q.top();q.pop();
if(vis[u.x]) continue;
vis[u.x]=1;
if(u.x==T){
printf("%d\n",u.y);
return 0;
}
for(int i=Begin[u.x];i;i=Next[i])
if(chkmin(d[to[i]],u.y+w[i]) && !vis[to[i]])
q.push((point){to[i],d[to[i]]});
}
return 0;
}


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:狼抓兔子(最小割最大流+vector模板)

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

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

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

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

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

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

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

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

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

  8. BZOJ1001 狼抓兔子

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

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

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

随机推荐

  1. Luogu3162 CQOI2012 组装 贪心

    传送门 如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是 \(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i ...

  2. VB6 变量定义作用域的一个奇特形式

    C#或JAVA 下面的i定义是只会限定在if 条件块里的: if (1 == 2) { int i = 000; } else { i = 111;// 错误,未定义. } i = 222;//错误 ...

  3. C# LINQ 详解 From Where Select Group Into OrderBy Let Join

    目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...

  4. GATT服务搜索流程(一)

    GATT的规范阅读起来还是比较简答, 但是这样的规范在代码上是如何实现的呢?下面就分析一下bluedroid 协议栈关于GATT的代码流程. BLE的设备都是在SMP之后进行ATT的流程的交互.从代码 ...

  5. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(六)一定要RESTful吗?

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 这个问题看起来就显得有些萌,或者说类似的问题都有些不靠 ...

  6. C# 全屏坐标及区域坐标获取。自定义光标及系统光标描边捕捉显示。

    最近手头工作比较轻松了一点就继续研究和完善之前的录屏软件,使用AForge最大的问题在于:最原始的只能够录全屏,而自定义的录屏需要更改非常多的细节:like follows: 1.需要支持区域化录屏: ...

  7. JAVA CAS原理浅谈

    java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包.可见CAS的重要性. CAS CAS:Compare and Swap, 翻译成比较并交换. java.uti ...

  8. linux下core file size设置笔记

    现象说明:突然发现一台测试机器的java程序莫名其妙地没了,但是没有core dump!这就需要打开服务器的core文件生成的功能了,(即core dump文件),方便程序调试.1)core文件简介c ...

  9. 最近新明白的SQL小知识

    1.partition by和order by 先看三个小需求: ①查询出各个类编号的书本的数量. select count (类编号) as 数量, 类编号 from Books group by ...

  10. GCD实现同步方法

    在iOS多线程中我们知道NSOperationQueue操作队列可以直接使用addDependency函数设置操作之间的依赖关系实现线程同步,还可以使用setMaxConcurrentOperatio ...