Description


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

左上角点为(1,1),右下角点为(N,M)(上图中N=3,M=4).有以下三种类型的道路

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个数,表示斜向道路的权值.

Output:

输出一个整数,表示参与伏击的狼的最小数量.

Solution

转化为网络流,把每个有直接连边的点之间连一条权为X的边,然后跑一边最大流即可。

 //Writer : Hsz %WJMZBMR%tourist%hzwer
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;
const int S=,N=,M=,inf=0x3fffffff;
int to[M],val[M],nxt[M],h[N],head[N],ecnt=,T;
int n,m;
void add(int bg,int ed,int v) {
to[++ecnt]=ed;
nxt[ecnt]=head[bg];
val[ecnt]=v;
head[bg]=ecnt;
}
void ins(int bg,int ed,int x) {
add(bg,ed,x);
add(ed,bg,x);
}
bool bfs() {
memset(h,-,sizeof h);
h[S]=;
queue<int>q;
q.push(S);
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=head[u]; i; i=nxt[i]) {
if(val[i]&&h[to[i]]==-) {
h[to[i]]=h[u]+;
q.push(to[i]);
}
}
}
return h[T]!=-;
}
int dfs(int x,int f) {
if(x==T) return f;
int tp,used=;
for(int i=head[x]; i; i=nxt[i]) {
if(h[to[i]]==h[x]+&&val[i]) {
tp=dfs(to[i],min(f-used,val[i]));
val[i]-=tp;
val[i^]+=tp;
used+=tp;
if(used==f) return f;
}
}
if(!used ) h[x]=-;
return used;
}
int maxflow;
void dinic() {
maxflow=;
while(bfs()) {
maxflow+=dfs(,inf);
}
}
int main() {
int x;
cin>>n>>m;
T=n*m;
for(int i=; i<=n; i++) {
for(int j=; j<m; j++) {
scanf("%d",&x);
ins(m*(i-)+j,m*(i-)+j+,x);//建图过程。加的反边也应权为x,因为反向也可能跑兔子。
}
}
for(int i=; i<n; i++) {
for(int j=; j<=m; j++) {
scanf("%d",&x);
ins(m*(i-)+j,m*(i)+j,x);
}
}
for(int i=; i<n; i++) {
for(int j=; j<m; j++) {
scanf("%d",&x);
ins(m*(i-)+j,m*(i)+j+,x);
}
}
dinic();
cout<<maxflow;
return ;
}

BZOJ1001 BJOI2006 狼抓兔子的更多相关文章

  1. BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)

    显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...

  2. [bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图

    题目描述: 给定一个平面图,求最小割. 题解: 本题是一道经典题. 周冬Orz的论文是很好的研究资料. 这道题点太多,所以直接跑dinic无疑会超时. 我们观察原图,发现原图是一个平面图. 什么是平面 ...

  3. 【BZOJ1001】狼抓兔子(网络流)

    [BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...

  4. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  5. 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)

    [BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...

  6. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

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

  7. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

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

  8. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

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

  9. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

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

随机推荐

  1. javascript正則表達式

    定义一个正則表達式 能够用字面量 var regex = /xyz/; var regex = /xyz/i; 也能够用构造函数 var regex = new RegExp('xyz'); var ...

  2. Unreal Engine 4 Camera Lag(摄影机延迟)

    以官方的Third Person Template为样例,Character蓝图中的USpringArmComponent就实现了摄影机和场景碰撞和交互等大部分的功能了. 要实现摄影机延时,仅仅须要改 ...

  3. the solution of CountNonDivisible by Codility

    question:https://codility.com/programmers/lessons/9 To solve this question , I get each element's di ...

  4. light oj1074

    Description The people of Mohammadpur have decided to paint each of their houses red, green, or blue ...

  5. oc52--autorelease1

    // // main.m /* autorelease也是用于内存管理的,给对象发送autorelease消息就会把对象放入autoreleasepool这个池子中,当池子销毁的时候会对池子里面的所有 ...

  6. Coursera Algorithms week2 基础排序 练习测验: Intersection of two sets

    题目原文: Given two arrays a[] and b[], each containing n distinct 2D points in the plane, design a subq ...

  7. 第1课 Git、谁与争锋

    1-1  安装和使用Git http://git-scm.com/downloads Git的指令模式,才能够清楚地了解Git的工作细节.最后还会介绍Git Server的架设和管理,让读者能够熟练使 ...

  8. Web框架系列之Tornado

    前言 Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. Tornad ...

  9. VS2015 右侧导航插件地址

    右侧导航插件: https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.ProductivityPowe ...

  10. 5.13会话技术Cookie---Session

    .会话技术: 1.会话:一次会话中包含多次请求和相应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2.功能:在一次会话的范围内的多次请求间,共享数据 3.方式: 1.客 ...