Tragin算法不仅可以求割点和割边(割点和割边的算法差不多),还可以求取有向图的强连通分量个数(当然可是根据问题的不同适当做出修改比如求连通分量包括那些),时间复杂度是O(N+M)主要花费在了DFS上。先说一下割点中的low[]数组,其主要作用是保存当前节点所能接触到的标号最早的节点(不会从其父节点这条路过,也就是它上一个DFS的那个节点过去),如果不太清楚割点算法的请先看看割点算法https://blog.csdn.net/ZCMU_2024/article/details/81154947。
本人认为Tragin算法在强连通图中用到了两个定理:
1.一个有向图是强连通的,当且仅当图中有一个回路,它至少包含每个节点一次
2.在有向图G中,它的每一个节点位于且只位于一个强分图中
然后说说算法的一些实现(最好先看看割点是怎么实现的不然不好理解):
dfs[] 保存节点的标号
low[]保存节点所能接触到的标号最小的节点
instack[] 一会再说
stack<int> s一会再说
vis[] DFS通用数组