快速的稠密图 BFS
我们考虑以下问题:给一个 \(n\) 个点的图的补图。补图一共有 \(\mathcal{O}(n)\) 条边。如何尽可能快地完成一次原图上的 BFS(源点任意)?
我们考虑使用 STL 的 unordered_set 来维护这个过程。首先对于每个节点 \(u\),我们插入 \(u\) 不能通往的点。
我们使用一个该容器存储还未到达的点。
开始 BFS。普通的 BFS 中,我们遍历当前点 \(u\) 的每条边进行扩展。在这种特殊的情形下,我们将遍历边改为遍历未到达集合中的点。如果这个集合中的点不在 \(u\) 无法到达的点集中,将 \(u\) 加入队列,并且从未到达点集中删去。
那么,未到达点集中的一个点会贡献它在其它点的无法到达点集中出现的次数 \(+1\) 的时间复杂度,所以我们可以做到 \(\mathcal{O}(n + m) = \mathcal{O}(n)\)。
本文来自博客园,作者:Trent900,转载请注明原文链接:https://www.cnblogs.com/GE9X/p/21750443

浙公网安备 33010602011771号