CF821D Okabe and City

题目描述

Okabe 同学特别喜欢在有路灯照亮的街道上散步,这样就不会被小学生围殴了。 他的城市用一个二维网格表示,行从上到下是 $1 \sim n$,列号从左到右是 $1 \sim m$。其中有 $k$ 个格子被路灯照亮,左上角的格子保证是亮的。 Okabe 要从左上角走到右下角,只能踩着被照亮的格子移动(上下左右方向)。不过 Okabe 可以花费 $1$ 枚硬币,临时点亮任意一整行或一整列的格子来开路。 注意每次只能点亮一行或一列,切换点亮目标时必须站在初始就被照亮的格子上。当取消点亮后,那些原本不亮的格子又会陷入黑暗。 快来帮 Okabe 算出他最少要花多少硬币才能完成这场冒险!

输入格式

第一行三个整数 $n,m,k$($2 \le n,m,k \le 10^4$)。 接下来 $k$ 行,每行两个整数 $r_i$ 和 $c_i$ ($1 \le r_i \le n , 1 \le c_i \le m$),表示第 $i$ 个被照亮格子的坐标。 保证所有 $k$ 个坐标互不相同,且左上角格子一定被照亮。

输出格式

输出 Okabe 需要支付的最少硬币数,如果走不通就输出 `-1`。

说明/提示

第一个样例中,Okabe 可以走路径 $(1,1) \to (2,1) \to (2,3) \to (3,3) \to (4,3) \to (4,4)$,只需要在移动到 $(2, 3)$ 和 $(4, 4)$ 时各付 $1$ 硬币即可。 第四个样例中,路径可以是 $(1,1) \to (1,2) \to (2,2) \to (3,2) \to (3,3) \to (3,4) \to (4,4) \to (5,4) \to (5,5)$,在 $(1,2)$,$(3,4)$。$(5,4)$ 处各付 $1$ 硬币。 Translate by @[Moya_Rao](https://www.luogu.com.cn/user/814130)