1001: [BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 12827  Solved: 3044
[Submit][Status][Discuss]

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
 
题解:

  以1为源点,以m*n为汇点用Dinic跑一遍最大流即可,其中要注意由于题目中说了是无向边所以加边的时候要注意正向反向的边的权值要一样。

  写dinic()的BFS()时要整体跑完dis[]才能退出,如果只是发现能连向T就跳出,会造成有点的dis[]没有计算。还有一个有效的优化,就是在DFS()时如果结束时now==0,说明这个节点对答案不会再有贡献,直接dis[i]=0。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int inf=1e9;
const int maxn=,maxm=;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int N,M,val,S,T;
struct node{
int to,next,rest;
}e[maxm];
int head[maxn],ecnt=;
inline void addedge(int x,int y,int r){
e[++ecnt].to=y; e[ecnt].rest=r; e[ecnt].next=head[x]; head[x]=ecnt;
e[++ecnt].to=x; e[ecnt].rest=r; e[ecnt].next=head[y]; head[y]=ecnt;
}
int dis[maxn];
bool BFS(){
for(int i=S;i<=T;i++) dis[i]=;
dis[S]=;
static queue<int> Q;
Q.push(S);
while(!Q.empty()){
int x=Q.front(); Q.pop();
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(e[i].rest&&dis[y]==){
dis[y]=dis[x]+;
Q.push(y);
}
}
}
if(dis[T]) return true;
return false;
}
int DFS(int x,int flow){
if(x==T) return flow;
int now=,tmp;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(e[i].rest&&dis[y]==dis[x]+){
tmp=DFS(y,min(flow-now,e[i].rest));
e[i].rest-=tmp;
e[i^].rest+=tmp;
now+=tmp;
if(flow==now) return now;
}
}
if(!now) dis[x]=;
return now;
}
int dinic(){
int ans=;
while(BFS()){
ans+=DFS(S,inf);
}
return ans;
}
int main(){
N=read(); M=read();
S=; T=N*M+;
addedge(S,,inf); addedge(N*M,T,inf);
for(int i=;i<=N;i++){
for(int j=;j<=M-;j++){
val=read();
addedge((i-)*M+j,(i-)*M+j+,val);
}
}
for(int i=;i<=N-;i++){
for(int j=;j<=M;j++){
val=read();
addedge((i-)*M+j,i*M+j,val);
}
}
for(int i=;i<=N-;i++){
for(int j=;j<=M-;j++){
val=read();
addedge((i-)*M+j,i*M+j+,val);
}
}
printf("%d",dinic());
return ;
}

1001: [BeiJing2006]狼抓兔子的更多相关文章

  1. BZOJ 1001: [BeiJing2006]狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 20029  Solved: 4957[Submit][ ...

  2. BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)

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

  3. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

  4. BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23822  Solved: 6012[Submit][ ...

  5. 1001: [BeiJing2006]狼抓兔子(对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23595  Solved: 5940 Descript ...

  6. BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 24727  Solved: 6276[Submit][ ...

  7. BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

    平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...

  8. 对偶图 && 【BZOJ】1001: [BeiJing2006]狼抓兔子(对偶图+最短路)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 可谓惨不忍睹,一下午就在调这题了. 很久以前看到这题是一眼最大流,看到n<=1000,我 ...

  9. BZOJ 1001: [BeiJing2006]狼抓兔子 最小割

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...

随机推荐

  1. JVM难学?那是因为你没认真看完这篇文章(转)

    一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分类: ...

  2. PhoneGap 第一个程序

    首先,现在PhoneGap  ZIP包. index.html <!DOCTYPE HTML lang="zh-CN"> <html> <head&g ...

  3. python技巧之下划线(二)

    Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...

  4. async 的三大返回类型

    序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task<TResult>. ...

  5. XMLHttpRequest 对象 status 和statusText 属性对照表

    XMLHttpRequest 对象 status 和statusText 属性对照表 status statusText 说明 0** - 未被始化 1** - 请求收到,继续处理 100 Conti ...

  6. 《挑战程序设计竞赛》2.3 动态规划-基础 POJ3176 2229 2385 3616 3280

    POJ3176 Cow Bowling 题意 输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个 ...

  7. C#中对文件的操作小结

    1.建立一个文本文件 public class FileClass { public static void Main() { WriteToFile(); } static void WriteTo ...

  8. 系统根据用户cookies,为用户打上各种标签

    DSP营销学院_品友学院 | 品友推广官网 http://e.ipinyou.com/school_article40.html 智能算法+动态出价=最大发挥推广费用的价值 针对每一个曝光进行甄别和竞 ...

  9. Byzantine failures

    https://baike.baidu.com/item/拜占庭将军问题/265656?fr=aladdin 拜占庭将军问题(Byzantine failures),是由莱斯利·兰伯特提出的点对点通信 ...

  10. XML 解析之 jaxp 解析器

    XML 的解析方式有两种方式: DOM 解析和 SAX 解析. DOM 解析: 根据 XML 的层级结构, 在内存中分配一个树形结构, 把 XML 的标签, 属性和文本都封装成对象. 优点: 可以实现 ...