0分求助

P1141 01迷宫

你有没有想过每次 $bfs$ 时都要清空一次的事情?
by yangzishuo0418 @ 2024-02-09 12:35:31


没清空的话你没法判断那个点你有没有踩过
by yangzishuo0418 @ 2024-02-09 12:36:48


应该在第 $52$ 行之后插入 ``` memset(ans,-1,sizeof a) ``` (尽管这样可能会超时)
by yangzishuo0418 @ 2024-02-09 12:38:18


显然,这个程序复杂度就不对 如果迷宫是一个所有格子互相可达的图,那么一次搜索的时间可以达到 $O(n^2)$,那么对于整体而言,复杂度会达到 $O(n^2m)$ 鉴于 $n$ 的极限是 $10^3$,$m$ 的极限是 $10^5$,则你的程序的运算次数将达到 $10^{11}$ 量级,而且并未计算常数,又因为计算机运行速度(CPU 主频)大概在 $4GHz(4\times10^9)$ 左右,因此此程序会 TLE, 无法通过 而且,你每次 BFS 时的 `ans` 数组并未初始化,导致结果肯定就不对,直接 WA 另,你需要知道,`register` 关键字已经弃用了,而 Luogu 有 $O2$ 优化选项,`#pragma G++ optimize(2)` 没必要,`std::queue` 又是对 `std::deque` 的封装,后者常数极大,解绑优化在小规模输入时也没有用处,你这优化了也和没优化一样 正确的解法是,鉴于此迷宫可被看为一个无向图,也就是说,若 A 能到 B,则 B 一定能到 A(显然),那么一个连通分量内的答案都是相等的,也就是这个联通分量的大小。 求解这个可以使用 `Tarjan` 算法,当然这太大材小用,我们只需要进行多次 DFS 查找全部连通分量即可。 此算法时间复杂度可以达到 $O(n)$,完全可以通过这题。我就是用的这个解法 AC 的(
by masonxiong @ 2024-02-09 22:40:32


|