简要题意:
给定一张图,求多少个点,每个点都能到达它。
本题作为强连通分量的入门题。
何为强连通分量?有什么用?
下面一一解释。
首先,我们要确认,这道题目如果不用强连通分量而用其它方法(比如说暴力)的话:
时间复杂度将达到 O ( n 2 ) O(n^2) O(n2),此时不易通过,也非正解。
强连通分量是什么?我们来看一张图吧。
我们希望,如果能把环通过某种方式去掉,然后变成有向无环图,就很容易了。
一个强连通分量中的点两两可达。(有向图中)一个点也可以被认为是一个强连通分量。
也就是说,你会发现,一个环 或者 若干个相交的环 都会变成一个强连通分量。
显然它们两两可达,最后图会变成若干个强连通分量。
你会发现, 1 1 1 是一个强连通分量, 2 , 3 , 4 , 5 2,3,4,5 2,3,4,5 是一个强连通分量, 6 6 6, 7 7 7, 8 8 8 均为一个单独的强连通分量。
此时我们可以简化这个图变成:
q x qx qx 表示 x x x 号强连通分量。
此时你发现 q 4 q4 q4 就是答案,里面装的是 7 7 7,所以答案为 1 1 1.
那么问题在于,如何求强连通分量?
回到这个图。
用 d f n i dfn_i dfni 表示 i i i 的遍历编号(就是我们常说的 “时间戳”), f i f_i fi 为 i i i 号节点属于的强连通分量编号, l o w i low_i lowi 为 i i i 号节点能走到的 d f n dfn dfn 值最小的节点。
一开始 l o w i = i ( 1 ≤ i ≤ n ) low_i = i (1 \leq i \leq n) lowi=i(1≤i≤n).
首先,我们从 1 1 1 节点开始遍历,走到 2 2