快速的稠密图 BFS

我们考虑以下问题:给一个 \(n\) 个点的图的补图。补图一共有 \(\mathcal{O}(n)\) 条边。如何尽可能快地完成一次原图上的 BFS(源点任意)?

我们考虑使用 STL 的 unordered_set 来维护这个过程。首先对于每个节点 \(u\),我们插入 \(u\) 不能通往的点。

我们使用一个该容器存储还未到达的点。

开始 BFS。普通的 BFS 中,我们遍历当前点 \(u\) 的每条边进行扩展。在这种特殊的情形下,我们将遍历边改为遍历未到达集合中的点。如果这个集合中的点不在 \(u\) 无法到达的点集中,将 \(u\) 加入队列,并且从未到达点集中删去。

那么,未到达点集中的一个点会贡献它在其它点的无法到达点集中出现的次数 \(+1\) 的时间复杂度,所以我们可以做到 \(\mathcal{O}(n + m) = \mathcal{O}(n)\)

posted @ 2026-07-21 20:11  Trent900  阅读(4)  评论(0)    收藏  举报