Game King
前言
部分分有点少,但出题人已经尽力了......
30\% 的数据
对于每一个点, BFS 一遍找到所有它能到达的点,再暴力枚举每一个点判断是否合法。
总时间复杂度
60\% 的数据
考虑使用 bitset 优化 30% 的数据 中的算法,即用 bitset 表示一个点能到达的点的集合。
具体的,由于同一个强连通分量内的点互相可达,故可以先对图进行 缩点 变成一张有向无环图。
此时我们按照拓扑序从大到小计算每个点能到达的点,每次将它连出去的点的 bitset 或起来即可。
总时间复杂度 bit 。
100\% 的数据
同样的,先对图进行 缩点 变成一张有向无环图。当然不 缩点 也可以得到足足
注意到拓扑序比较大的点一定无法到达比较小的点,换句话说一个点只可能到达比它拓扑序大的点。
考虑对于每一个点算出它是否能到达所有拓扑序比它大的点,以及能否被所有拓扑序比它小的点到达。
接下来考虑如何计算前者,后者同理。按拓扑序从大到小不断加点,考虑一个点合法的充要条件。
若当前图有至少两个点入度为
否则必定符合要求,考虑每个点只保留一个入边,最终每个点沿着入边走必定能走到当前新加入的点。
在 拓扑排序 的时候动态维护一下有多少个点入度为