这周刚刚看了图论的一些东西,感觉自己理解比较费劲,所以这里小小总结一下,如果有误,欢迎指出

好了,现在我们来看一下图论的一些基础的概念:
有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。

那么在这个有向图中,我们怎么去求一个强连通分量呢?
这里呢,就介绍一下tarjan算法
我们对于任意一个有向图进行dfs, 得到搜索树,而很显然,对于一个强连通分量来说,它一定是有某个深度优先搜索树上的生成树。因此,当我们搜索的时候沿路保存每一个点,当有环形成的时候,这就将成为一个强连通,我们只要找到最大的那个环,那么就是我们要找的强连通分量,那么怎么样去找到最大的那个环呢?

首先我们先将所有访问过的点都放入栈中,并且标记他们每个点初始被访问到的时间或者认为是每个点按BFS的顺序给一个序号放在dfn[i]数组中,当遇到环的时候,我们将该条路径中所有点的祖先都记录为这个路径中最小的序号low[i]中,当然一个强连通分量是由很多个环组成的,但这些环内的点因为彼此可以到达,所以一定可以找到一个最小的祖先,那么我们只要发现dfn[i]=low[i]的时候,i就是最早出现的那个强连通分量中的点,此时,我们把从i 到栈顶的所有元素都出栈,他们就是我们要求的一个强连通分量…