Description
给定 $n\ (1 \leq n \leq 10^4)$ 个点,$m\ (1 \leq m \leq 5 \times 10^4)$ 条边的有向图,求有多少点能够被所有点到达(不包括自己)。
Source
Solution
受欢迎的奶牛只有可能是出度为 $0$ 的强连通分量里的点。因为在同一个强连通分量里的所有点都是能互相到达的,所以 这个强连通分量外与它相连的点 不可能和 这个强连通分量内的点 互相到达,换句话说,如果某强连通分量内存在点 $u$,该强连通分量外某点 $v$ 与 $u$ 相连,那么边 $u \rightarrow v$ 和 $v \rightarrow u$ 只可能存在 $1$ 条,若存在边 $u \rightarrow v$(这个强连通分量的出度不为 $0$),则这个强连通分量里的点就不能被所有点到达(不存在边 $v \rightarrow u$,即 $v$ 不能到达 $u$)。如下图所示,共有 $4$ 个强连通分量,分别是 $\{a,b,c\},\{d\},\{f\},\{e,g,h\}$ 。出度为 $0$ 的强连通分量只有 $\{a,b,c\}$,这个强连通分量里的所有点都与除自己外的其它点连通。
如果存在 $2$ 个及以上出度为 $0$ 的强连通分量呢(如下图)?很显然 $\{a,b,c\},\{e,g,h\}$ 这 $2$ 个强连通分量内的点彼此都不能到达,所以没有符合题意的答案。
因此跑一边 $\rm tarjan$ 缩点,把图变成一个 DAG(有向无环图至少存在一个出度为 0 的点),再统计每个强连通分量的出度,如果只存在一个出度为 $0$ 的强连通分量,那么答案就是这个强连通分量点的个数,否则答案为 $0$ 。时间复杂度为 $O(n)$ 。
Code
1 |
|