算法简介
图割点
相关概念
- 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图.
- 图的割点:如果去掉一个点以及与它连接的边,该点原来所在的图被分成两部分(不连通),则称该点为割点.
- 深度优先生成树:对图进行深度优先遍历,遍历所形成的路径称为深度优先生成树
图基础知识
深度优先生成树
- 原无向图
- 从A处开始深度优先遍历生成的深度优先生成树
- 从C处开始遍历生成的深度优先生成树
- 说明
- 每个图顶点含有2个数字,比如A 1/1,前面的表示Num(A)=1,即深度优先遍历的顺序;
后一个表示Low(A)=1,表示A能够到达的最低顶点编号. - 虚线表示背向边
相关算法
代码示例图
- 原图
- 深度遍历示意图
- 最终每个顶点的最小时间戳示意图
1. tarjan算法
* 时间复杂度:
- 深度优先遍历或广度优先遍历:O(N(N+M))
- tarjan算法:
用邻接矩阵存储:O(N^2)
用邻接表存储:O(N+M)
* 算法特点:
- 需要用DFS遍历图的所有顶点,记录num[顶点编号] = 顶点深度遍历时间戳
- 当遍历到顶点u时,枚举顶点u的所有出边,比如v,如何知道v不经过父节点u能否回到祖先节点呢?对子节点v再次DFS
- 需要记录每个子节点v在不经过父节点u的情况下,能够回到的最小时间戳(若存在v的父节点不止u一个的情况下):lows[v] = min(lows[v],nums[f])
- v回溯的时候获取当前节点的最小时间戳low[u]=min(low[u],low[v]),如果low[v]>=num[u],表示v不能不经过u回到祖先,即u为割点