1001: [BeiJing2006]狼抓兔子

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
 
-----------------------------------------我是傲娇的分割线---------------------------------------------

显然是个最大流问题。

边数达到了10^6级别,显然用dinic算法会TLE

对于一个平面图来说,当然用对偶图的最短路来求最小割(最大流)

SPFA转移的时候注意判断边界情况

应该要开longlong才能过

上代码:

/**************************************************************
Problem: 1001
User: xialan
Language: C++
Result: Accepted
Time:5648 ms
Memory:56480 kb
****************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
typedef long long LL;
inline LL read(){
LL x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){
x=x*+ch-'';
ch=getchar();
}
return x;
}
struct edge{
int x,y;bool f;
};
queue<edge>q;
const int M=;
const LL MM=(LL)1e15;
LL dis[M][M][],hang[M][M],lie[M][M],xie[M][M],vis[M][M][];
int main(){
int n,m;
scanf("%d%d",&n,&m);
rep(i,,n)rep(j,,m-)hang[i][j]=read();
rep(i,,n-)rep(j,,m)lie[i][j]=read();
rep(i,,n-)rep(j,,m-)xie[i][j]=read();
rep(i,,n-)rep(j,,m-)dis[i][j][]=dis[i][j][]=MM;
memset(vis,,sizeof(vis));
rep(i,,m-){
dis[][i][]=hang[][i];
vis[][i][]=;
q.push((edge){,i,});
}
dis[][m-][]=min(hang[][m-],lie[][m]);
q.push((edge){,m-,});
vis[][m-][]=;
rep(i,,n-){
dis[i][m-][]=lie[i][m];
vis[i][m-][]=;
q.push((edge){i,m-,});
} while(!q.empty()){
edge u=q.front();q.pop();vis[u.x][u.y][u.f]=;
if(u.f){
if(u.x>){
if(dis[u.x-][u.y][]>dis[u.x][u.y][]+hang[u.x][u.y]){
dis[u.x-][u.y][]=dis[u.x][u.y][]+hang[u.x][u.y];
if(!vis[u.x-][u.y][]){
vis[u.x-][u.y][]=;
q.push((edge){u.x-,u.y,});
}
}
}
if(u.y<m-){
if(dis[u.x][u.y+][]>dis[u.x][u.y][]+lie[u.x][u.y+]){
dis[u.x][u.y+][]=dis[u.x][u.y][]+lie[u.x][u.y+];
if(!vis[u.x][u.y+][]){
vis[u.x][u.y+][]=;
q.push((edge){u.x,u.y+,});
}
}
}
if(dis[u.x][u.y][]>dis[u.x][u.y][]+xie[u.x][u.y]){
dis[u.x][u.y][]=dis[u.x][u.y][]+xie[u.x][u.y];
if(!vis[u.x][u.y][]){
vis[u.x][u.y][]=;
q.push((edge){u.x,u.y,});
}
}
}
else{
if(u.x<n-){
if(dis[u.x+][u.y][]>dis[u.x][u.y][]+hang[u.x+][u.y]){
dis[u.x+][u.y][]=dis[u.x][u.y][]+hang[u.x+][u.y];
if(!vis[u.x+][u.y][]){
vis[u.x+][u.y][]=;
q.push((edge){u.x+,u.y,});
}
}
}
if(u.y>){
if(dis[u.x][u.y-][]>dis[u.x][u.y][]+lie[u.x][u.y]){
dis[u.x][u.y-][]=dis[u.x][u.y][]+lie[u.x][u.y];
if(!vis[u.x][u.y-][]){
vis[u.x][u.y-][]=;
q.push((edge){u.x,u.y-,});
}
}
}
if(dis[u.x][u.y][]>dis[u.x][u.y][]+xie[u.x][u.y]){
dis[u.x][u.y][]=dis[u.x][u.y][]+xie[u.x][u.y];
if(!vis[u.x][u.y][]){
vis[u.x][u.y][]=;
q.push((edge){u.x,u.y,});
}
}
}
}
LL MIN=INT_MAX;
rep(i,,n-)MIN=min(MIN,dis[i][][]+lie[i][]);
rep(i,,m-)MIN=min(MIN,dis[n-][i][]+hang[n][i]);
printf("%lld\n",MIN);
return ;
}

bzoj1001(对偶图最短路)的更多相关文章

  1. 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路

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

  2. BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路

    问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...

  3. 【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路

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

  4. 【bzoj2007】[Noi2010]海拔 最小割+对偶图+最短路

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交 ...

  5. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

  6. BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)

    题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...

  7. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

  8. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

  9. [BZOJ2007][NOI2010]海拔(对偶图最短路)

    首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...

  10. [BJOI2006]狼抓兔子——最小割转对偶图最短路

    其实这个题直接Dinic跑最小割可过. (小优化是: 无向图建网络流,一条边不用建成4条,可以正反容量都是边权即可.完全等价 ) [无效]网络流之转换对偶图 一个巧妙的事情是,如果建边合适的话,最小割 ...

随机推荐

  1. OOP编程特性综合项目

    package SourceFile; //创建动物类(父类). public abstract class CAnimal {  public boolean mammal;   //是不是哺乳动物 ...

  2. FPGA与Deep Learning

    你还没听过FPGA?那你一定是好久没有更新自己在IT领域的知识了. FPGA全称现场可编程门阵列(Field-Programmable Gate Array),最初作为专用集成电路领域中的一种半定制电 ...

  3. ABP增删改查代码片段

    @using System.Web.Optimization @using MultiPageSimpleTask.Entitys.Dtos; @model IList<ProductDto&g ...

  4. 新版MySql 5.6.20,安装后无法登陆的解决办法

    1.按照提示安装好mysql 2.运行cmd 进入mysql的安装目录,我的安装目录C:\Program Files\MySQL\MySQL Server 5.6\bin 输入 cd C:\Progr ...

  5. Jquery购物车jsorder改进版,支持后台处理程序直接转换成DataTable处理

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. cocos2dx - android环境配置及编译

    接上一节内容:cocos2dx - 伤害实现 本节主要讲Android环境配置及编译 在第一节中setup.py的配置里,我们没有配置对应的ndk,sdk,ant的路径,在这里需要先配置好环境变量. ...

  7. RoportNG报表显示中文乱码和TestNG显示中文乱码实力解决办法

    最近在进军测试自动化框架学习阶段,但无意间总是会伴随小问题的困扰,比如中文乱码,而导致显示总是不舒服,个人觉得,就一定要解决,似乎有点点强迫症.所以遇到RoportNG报表显示中文乱码和TestNG显 ...

  8. Node Inspector 代理实现

    本文首发于 https://github.com/whxaxes/blog/issues/9 背景 平时做 node 开发的时候,通过 node inspector 来进行断点调试是一个很常用的 de ...

  9. Ubuntu使用Windows下的conio.h

    把虚线框里面的内容粘贴进文档文本里面 --------------------------------------------------------------------------------- ...

  10. 利用大白菜制作多系统启动U盘(win+ubuntu+PE+...)

    网上提供的方法很多都过时了,不适用,要不就是讲的不清楚 我结合http://www.xuebuyuan.com/848003.html大神的方案,加以研究,整理出了此篇文章 先看下最终成果: 好了,感 ...