#apc001i. [apc001_i]Simple APSP Problem

[apc001_i]Simple APSP Problem

问题描述

给定一个 H×WH \times W 的网格。左上角的方块表示为 (0,0)(0, 0),右下角的方块表示为 (H1,W1)(H-1, W-1)

其中,NN 个方块 (x1,y1),(x2,y2),...,(xN,yN)(x_1, y_1), (x_2, y_2), ..., (x_N, y_N) 被涂黑,其余方块被涂白。

定义两个白色方块 AABB 之间的最短距离为从 AA 出发,只经过白色方块,到达 BB 的最少移动次数。每次移动可以向上、下、左或右移动一个方块。

由于总共有 H×WNH \times W - N 个白色方块,因此选择其中两个白色方块的方式有 (H×WN)C2_{(H \times W - N)}C_2 种。

对于每种选择,找到选定方块之间的最短距离,然后计算所有距离的和,模 11 000000 000000 007=109+7007=10^9+7

约束条件

  • 1H,W1061 \leq H, W \leq 10^6
  • 1N301 \leq N \leq 30
  • 0xiH10 \leq x_i \leq H-1
  • 0yiW10 \leq y_i \leq W-1
  • 如果 iji \neq j,则 xixjx_i \neq x_j 或者 yiyjy_i \neq y_j
  • 至少有一个白色方块。
  • 对于每对白色方块 AABB,从 AA 可以经过只有白色方块的路径到达 BB

输入

输入以以下格式从标准输入中给出:

HH WW NN x1x_1 y1y_1 x2x_2 y2y_2 : xNx_N yNy_N

输出

输出最短距离的和,模 109+710^9+7

示例输入1

2 3
1
1 1

示例输出1

20

我们得到以下网格(. 表示白色方块,# 表示黑色方块)。

...
.#.

我们为每个白色方块分配如下字母。

ABC
D#E

然后,我们有:

  • dist(A, B) = 11
  • dist(A, C) = 22
  • dist(A, D) = 11
  • dist(A, E) = 33
  • dist(B, C) = 11
  • dist(B, D) = 22
  • dist(B, E) = 22
  • dist(C, D) = 33
  • dist(C, E) = 11
  • dist(D, E) = 44

其中 dist(A, B) 是 A 和 B 之间的最短距离。这些距离的和是 2020

示例输入2

2 3
1
1 2

示例输出2

16

我们为每个白色方块分配如下字母。

ABC
DE#

然后,我们有:

  • dist(A, B) = 11
  • dist(A, C) = 22
  • dist(A, D) = 11
  • dist(A, E) = 22
  • dist(B, C) = 11
  • dist(B, D) = 22
  • dist(B, E) = 11
  • dist(C, D) = 33
  • dist(C, E) = 22
  • dist(D, E) = 11

这些距离的和是 1616

示例输入3

3 3
1
1 1

示例输出3

64

示例输入4

4 4
4
0 1
1 1
2 1
2 2

示例输出4

268

示例输入5

1000000 1000000
1
0 0

示例输出5

333211937