Robert Tarjan,一个很牛逼的计算机科学家。
tarjan算法真的是一个神奇的算法,一个简单的dfs却可以解决连通性的问题以及求最近公共祖先。
1.求强连通分量
首先介绍一下什么是强连通分量。
强连通(Strongly Connected)是指一个有向图(Directed Graph)中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径。
强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。
当我们知道了强连通分量是什么了之后,我们来学习一下tarjan算法是如何求强连通分量的。
其实tarjan算法写起来很简单,就是一遍dfs,但是理解起来确实有点麻烦。
首先,
dfs就是我们通常的dfs,每个点需要标记有没有访问过,如果没有就往下dfs。
dfs出来的其实是一个搜索树。
每个节点我们需要保存两个信息
1.dfn[x],表示x是第几个访问的,就相当于有个cnt,每调用一层dfs,就使得cnt+1,然后赋值给当前访问的节点。
2.low[x],这个就不太好理解了,指的是,从这个点往下继续搜索所能搜索到的反回边所指向的已经搜过的节点的最小编号。
这个low[x]其实是在dfs的过程中递归求出来的一个结果,对于u->v分两种情况
(0.初始时low[u]=dfn[u],如果这个点处理完low[u]仍然不能改变的话,说明无法搜索到已访问过的点)
1.v是没有访问过的节点,dfs(v),回溯时low[u]=min(low[u],l

Tarjan算法通过深度优先搜索(DFS)解决图论问题,如求强连通分量、割点和桥。在强连通分量中,算法维护dfn和low值,当low[u]==dfn[u]时,栈中点组成强连通分量。对于割点,若dfn[u]<=low[u],则u是割点,因为它删除后会导致图不连通。同样,tarjan也可用于求桥,若dfn[u]>low[v],边(u, v)是桥,因为它去除后会破坏连通性。"
136654680,18172652,使用YOLOv9训练自定义数据集指南,"['目标检测', 'YOLO', '深度学习', 'pytorch', '模型训练']
最低0.47元/天 解锁文章
219

被折叠的 条评论
为什么被折叠?



