AtCoder-abc351_d 题解

原题 翻译

题意简述

给定 \(H \times W\) 的网格图,如果一个字符是 #,则不能走到该字符上;如果是 .,则可以走到该字符上,但如果它周围 \(4\) 个格子中有 # 字符,则不能再继续行走了。

自由度是指从一个格子出发,能走到不同格子的数量(可以出发多次)。求出所有格子的最大自由度。

思路

考虑建图:每个格子的编号为 \((i-1) \times m+j\)。如果一个格子能走到另一个格子,则将这两个格子连边。

现在这是一个有向有环图。我们将该图进行缩点,得到一个有向无环图。新图中每个点的权值为该 SCC 中的结点个数。

\(dp_i\) 表示从第 \(i\) 个 SCC 出发能到达格子的数量。求 \(dp_i\) 时,如果使用普通的拓扑排序,则需要建反图,比较麻烦。我们可以直接采用记忆化搜索,代码好写且保证时间复杂度。

另外在缩点后新连边的时候,可能会连到重边,这对后面求 \(dp_i\) 是有影响的。因此我们可以用一个 set<pair<int,int>> 来去重。

最后将所有 \(dp_i\) 取最大值,即可得到答案。

代码

posted @ 2024-04-28 20:24  lrx139  阅读(24)  评论(0编辑  收藏  举报