AT_apc001_i Simple APSP Problem

题目描述

给定一个 $H \times W$ 的网格。我们将左上角的格子记作 $(0,\ 0)$,右下角的格子记作 $(H-1,\ W-1)$。 在这些格子中,有 $N$ 个格子 $(x_1,\ y_1),\ (x_2,\ y_2),\ ...,\ (x_N,\ y_N)$ 被涂成黑色,其余格子为白色。 对白色格子 $A$ 与 $B$,定义它们之间的最短距离为:仅通过**白色格子**从 $A$ 走到 $B$ 所需要移动的最小步数。每一步只能移动到上下左右相邻的格子。 由于白色格子共有 $H \times W - N$ 个,所以可以从中任选两个格子的方案数为 $_{(H\times W-N)}C_2$。 请对于所有 $_{(H\times W-N)}C_2$ 种选取的方式,分别求出选中两格之间的最短距离,将所有距离加和并对 $1,\!000,\!000,\!007 = 10^9 + 7$ 取余。

输入格式

输入通过标准输入依下述格式给出。 > $H$ $W$ $N$ $x_1$ $y_1$ $x_2$ $y_2$ $:$ $x_N$ $y_N$

输出格式

输出最短距离总和对 $10^9+7$ 取余后的值。

说明/提示

## 约束条件 - $1 \leq H, W \leq 10^6$ - $1 \leq N \leq 30$ - $0 \leq x_i \leq H-1$ - $0 \leq y_i \leq W-1$ - 当 $i \neq j$ 时,$x_i \neq x_j$ 或 $y_i \neq y_j$ - 至少存在一个白色格子 - 任意两个白色格子 $A, B$ 之间,仅通过白色格子可互相到达 ## 样例说明 1 该网格的色彩分布如下(`.` :白色,`#` :黑色): ``` ... .#. ``` 此时,给白格编号如下所示: ``` ABC D#E ``` 则有: - dist(A, B) = $1$ - dist(A, C) = $2$ - dist(A, D) = $1$ - dist(A, E) = $3$ - dist(B, C) = $1$ - dist(B, D) = $2$ - dist(B, E) = $2$ - dist(C, D) = $3$ - dist(C, E) = $1$ - dist(D, E) = $4$ 这些距离的总和为 $20$。其中,dist(A, B) 表示格子 A 和 B 之间的最短距离。 ## 样例说明 2 给白格编号如下: ``` ABC DE# ``` 则有: - dist(A, B) = $1$ - dist(A, C) = $2$ - dist(A, D) = $1$ - dist(A, E) = $2$ - dist(B, C) = $1$ - dist(B, D) = $2$ - dist(B, E) = $1$ - dist(C, D) = $3$ - dist(C, E) = $2$ - dist(D, E) = $1$ 这些距离的总和为 $16$。 由 ChatGPT 5 翻译