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

  2015.4.16新加数据一组,可能会卡掉从前可以过的程序。

Solution

  乍一看是一道网络流的题,但是实际写完会发现超时超到姥姥家去了。

  定理:平面图的最大流=该图对偶图的最短路,某形象解释见某贴心神犇
  之后SPFA乱搞或Dijkstra乱搞,不过我建边的方式有点鬼畜。
 
 #include <cstdio>
#include <cstring>
using namespace std;
struct node
{
int v, w;
}edge[];
int fst[], nxt[], sss, ttt, dis[], q[], front, back;
bool inq[]; void qscanf(int &x)
{
char c = getchar();
x = ;
while(c < '' || c > '')
c = getchar();
while(c >= '' && c <= '')
x = x * + c - '', c = getchar();
} void addedge(int i, int u, int v, int w)
{
edge[i << ] = (node){v, w}, nxt[i << ] = fst[u], fst[u] = i << ;
edge[i << | ] = (node){u, w}, nxt[i << | ] = fst[v], fst[v] = i << | ;
} void SPFA()
{
memset(dis, , sizeof(dis));
dis[sss] = , inq[sss] = q[++back] = sss;
while(front != back)
{
int u = q[++front % ];
inq[u] = false, front %= ;
for(int i = fst[u]; i; i = nxt[i])
{
int v = edge[i].v, w = edge[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(!inq[v])
{
dis[v] = dis[u] + w;
inq[v] = true;
q[++back % ] = v;
back %= ;
}
}
}
}
} int main()
{
int n, m, etot = ;
qscanf(n), qscanf(m);
n--, m--;
if(n && m)
{
sss = n * m * + , ttt = n * m * + ;
for(int i = ; i <= n + ; i++)
for(int j = ; j <= m; j++)
{
int u = ((i - ) * m + j) * - , v = ((i - ) * m + j) * , w;
qscanf(w);
if(i == )
addedge(++etot, sss, v, w);
else if(i == n + )
addedge(++etot, u, ttt, w);
else
addedge(++etot, u, v, w);
}
for(int i = ; i <= n; i++)
for(int j = ; j <= m + ; j++)
{
int u = ((i - ) * m + j) * - , v = ((i - ) * m + j) * - , w;
qscanf(w);
if(j == )
addedge(++etot, ttt, v, w);
else if(j == m + )
addedge(++etot, u, sss, w);
else
addedge(++etot, u, v, w);
}
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
{
int u = ((i - ) * m + j) * - , v = ((i - ) * m + j) * , w;
qscanf(w), addedge(++etot, u, v, w);
}
SPFA();
}
else
{
if(m)
n = m;
dis[ttt] = ;
for(int i = ; i <= n; i++)
{
qscanf(fst[i]);
if(dis[ttt] > fst[i])
dis[ttt] = fst[i];
}
}
printf("%d\n", dis[ttt]);
return ;
}

[BZOJ1001] [Beijing2006] 狼抓兔子 (最短路)的更多相关文章

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

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

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

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

  3. BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)

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

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

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Se ...

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

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

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

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

  7. bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...

  8. bzoj1001: [BeiJing2006]狼抓兔子(初识是你最小割)

    1001: [BeiJing2006]狼抓兔子 题目:传送门 题解: 听说这题当初是大难题...可惜当年没有网络流hahahha 现在用网络流的思想就很容易解决了嘛 给什么连什么,注意是双向边,然后跑 ...

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

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

随机推荐

  1. Linux下配置APACHE支持PHP环境

    编辑 /usr/local/apache2/conf/httpd.conf 文件时要注意: 找到: AddType application/x-compress .Z AddType applicat ...

  2. 一个shell脚本给客户使用服务器生成一个序列号

    #!/bin/bash interface=`ls /sys/class/net|grep en|awk 'NR==1{print}'` if [ ! -e /etc/adserver/.seq.in ...

  3. JS实现图片''推拉门''效果

    JS实现图片''推拉门''效果   ''推拉门''动效也可以称作"手风琴"效果,大多数效果实现的思路基本是一样的,下面介绍两种方法,一种是通过改变图片的偏移位置实现移动,另一种是通 ...

  4. JAVAEE——BOS物流项目06:分页查询、分区导出Excel文件、定区添加、分页问题总结

    1 学习计划 1.分区组合条件分页查询 n 分区分页查询(没有过滤条件) n 分区分页查询(带有过滤条件) 2.分区导出 n 页面调整 n 使用POI将数据写到Excel文件 n 通过输出流进行文件下 ...

  5. 怎么添加用户到sudo用户组

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 前段时间用Ubuntu的sudo用惯了,回到kali发现自己的用户太low了, ...

  6. 华为云照片的爬虫程序更新(python3.6)

    一.背景: 每年终都有一个习惯,就是整理资料进行归档,结果发现手机照片全备份在华为云里,在官网上找了一圈,没找到官方的pc工具用来同步照片. 于是找出上次写的程序,看看能不能爬到数据,然而……果然不好 ...

  7. Halcon一日一练:图像拼接技术2:步骤与例程

    上一篇主要介绍了图像拼接的一些原理和方法,这一篇将主要介绍步骤和例程: 接上一篇: 基于特征的接拼方法,分为四个步骤 1.特征检测:从图像中检测出显著且独特的图像特征,诸如:闭合区域,直线段,边缘,轮 ...

  8. 接口测试基础(fiddler、postman的使用、python实现测试接口程序)

    写在前面:本文主要的章节规划: 1.什么是接口测试    另外,有的时候会直接调用别的公司的接口,比如银行的.淘宝的.支付宝的,此时也需要做接口测试以及验证数据: 做接口测试的好处:      其中, ...

  9. PHP常见面试题总结

    1.include 和 require 都能把另外一个文件包含到当前文件中 他们有什么区别?include 和 include_once 又有什么区别? 二者区别只有一个,那就是对包含文件的需求程度 ...

  10. [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...