SCC 图的构建思路蛮有意思的,把强连通分量看成一个点,整个图就瞬间清爽了不少。第一次DFS记录完成时间,第二次在转置图上搞一次新的 DFS,每次新起点就标记一个新的 SCC。这样完之后,谁指向谁就清楚了,搞图缩点的时候方便。

对交叉边的判断也比较巧妙。如果你在访问SCC C的时候,遇到了指向一个已经访问过的C',那就可以在缩点图上连一条边 (C', C)。因为在原来的转置图里有从 C 到 C'的边嘛,这种思路利索。

算法实现不复杂,推荐你用个栈来记录第一次 DFS 完成时间,第二次从栈顶一个个弹出来跑 DFS,顺序刚好反过来,效率也高,逻辑也清晰。

想看配套思维导图?可以点进数据结构图论思维导图看看;或者想对比下其他图论算法,比如割点割边那种,也挺有参考价值。

如果你还在啃图论的基本功,SCC 这个思路一定得搞明白,后面多套路,比如 DP+图、拓扑序、环检测啥的,全靠它打基础。