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
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
Source
妙哉
但是有点坑(如果仔细一点还是想得到)
这道题可以直接最短路,具体说来:
按照从左下到右上的直线将图分层(斜线连接的层数相差2,横线竖线连接的层相差1),那么兔子要被吃掉当且仅当在从这一层到另外一层的时候。
于是我么需要证明一个东西:
狼的路线是首尾相连的,即狼形成了一条链,区别于多叉树以及根节点数量大于1的森林(环就不说了,下面会给出证明)
证明:显然可得法,一波带走。(鸽掉了)
于是直接从左下的超级起点向右上的超级终点最短路就可以了。
注意:当 n = = 1 n==1 n==1 m = = 1 m==1 m==1的时候一定要特判
蒟蒻我WA飞了
顺便说一下,我的点是按照这种方式弄的。
我没有鸽掉,只是图床鸽掉了
C o d e : Code: Code:
#include <bits/stdc++.h>
#define ENDL printf ("\n")
#ifdef wll
#include <windows.h>
#endif
#define xx first
#define yy second
using namespace std;
struct _in {
const _in&operator , (register int & a) const {
a = 0;
char k = getchar ();
int f = 1;
while (k <'0' || k > '9') {
if (k ==