图论(二):图的割点(cut vertex)与连通度(connectivity)
欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~
1. 割点与连通度
在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一个没有关节点的连通图称为重连通图(biconnected graph)。若在连通图上至少删去k 个顶点才能破坏图的连通性,则称此图的连通度为k。
关节点和重连通图在实际中较多应用。显然,一个表示通信网络的图的连通度越高,其系统越可靠,无论是哪一个站点出现故障或遭到外界破坏,都不影响系统的正常工作;又如,一个航空网若是重连通的,则当某条航线因天气等某种原因关闭时,旅客仍可从别的航线绕道而行;再如,若将大规模的集成电路的关键线路设计成重连通的话,则在某些元件失效的情况下,整个片子的功能不受影响,反之,在战争中,若要摧毁敌方的运输线,仅需破坏其运输网中的关节点即可。
简单的例子
(a)中G7 是连通图,但不是重连通图。图中有三个关节点A、B 和G 。若删去顶点B 以及所有依附顶点B 的边,G7 就被分割成三个连通分量{A、C、F、L、M、J}、{G、H、I、K}和{D、E}。类似地,若删去顶点A 或G 以及所依附于它们的边,则G7 被分割成两个连通分量。
2. 求割点的方法
暴力的方法:
- 依次删除每一个节点v
- 用DFS(或BFS)判断还是否连通
- 再把节点v加入图中
若用邻接表(adjacency list),需要做VV次DFS,时间复杂度为O(V∗(V+E))O(V∗(V+E))。(题外话:我在面试实习的时候,只想到暴力方法;面试官提示只要一次DFS就就可以找到割点,当时死活都没想出来)。
有关DFS搜索树的概念
在介绍算法之前,先介绍几个基本概念
- DFS搜索树:用DFS对图进行遍历时,按照遍历次序的不同,我们可以得到一棵DFS搜索树,如图(b)所示。
- 树边:(在[2]中称为父子边),在搜索树中的实线所示,可理解为在DFS过程中访问未访问节点时所经过的边。
- 回边:(在[2]中称为返祖边、后向边),在搜索树中的虚线所示,可理解为在DFS过程中遇到已访问节点时所经过的边。
基于DFS的算法
该算法是R.Tarjan发明的。观察DFS搜索树,我们可以发现有两类节点可以成为割点:
- 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;
- 对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。
对于根结点,显然很好处理;但是对于非叶子节点,怎么去判断有没有回边是一个值得深思的问题。
我们用dfn[u]
记录节点u在DFS过程中被遍历到的次序号,low[u]
记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次序号最小),那么low[u]的计算过程如下:
下表给出图(a)对应的dfn与low数组值。
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
vertex | A | B | C | D | E | F | G | H | I | J | K | L | M |
dfn[i] | 1 | 5 | 12 | 10 | 11 | 13 | 8 | 6 | 9 | 4 | 7 | 2 | 3 |
low[i] | 1 | 1 | 1 | 5 | 5 | 1 | 5 | 5 | 8 | 2 | 5 | 1 | 1 |
对于情况2,当(u,v)为树边且low[v] >= dfn[u]
时,节点u才为割点。该式子的含义:以节点v为根的子树所能追溯到最早的祖先节点要么为v要么为u。
代码实现
void dfs(int u) {//记录dfs遍历次序static int counter = 0; //记录节点u的子树数int children = 0;ArcNode *p = graph[u].firstArc;visit[u] = 1;//初始化dfn与lowdfn[u] = low[u] = ++counter;for(; p != NULL; p = p->next) {int v = p->adjvex;//节点v未被访问,则(u,v)为树边if(!visit[v]) {children++;parent[v] = u;dfs(v);low[u] = min(low[u], low[v]);//case (1)if(parent[u] == NIL && children > 1) {printf("articulation point: %d\n", u);}//case (2)if(parent[u] != NIL && low[v] >= dfn[u]) {printf("articulation point: %d\n", u);}}//节点v已访问,则(u,v)为回边else if(v != parent[u]) {low[u] = min(low[u], dfn[v]);}}
}
采用邻接表存储图,该算法的时间复杂度应与DFS相同,为O(V+E)O(V+E)。
图论(二):图的割点(cut vertex)与连通度(connectivity)相关推荐
- neo4j python 算法_图论与图学习(二):图算法
选自towardsdatascience 作者:Maël Fabien机器之心编译参与:熊猫 图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构.检 ...
- 图论算法 最短路程_图论与图学习(二):图算法
选自towardsdatascience 作者:Maël Fabien 机器之心编译 参与:熊猫 图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构 ...
- 图的割点、桥与双连通分支
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- [转载]图的割点、桥与双连通分支
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- 图的割点 桥 双连通(byvoid)
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- 图的割点、桥和双连通分支的基本概念
点连通度与边连通度 回到正题,首先介绍下什么是图的边连通度和点连通度.一般来说,点连通度是指对应一个图G,对于所有点集U属于V(G),也就是V(G)的子集中,使得G-U要么是一个非连通图,要么就是一个 ...
- 图的割点、桥与双连通分支的基本概念
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...
- 图的割点 图的割边 二分图
枯木逢春不再茂,年少且惜镜边人 这周准备完结阿哈算法,其中有一章的学习不是很熟练(总之学的慢,忘的快.哎,真的,学完得好好从背包开始复习了,等复习完了,准备进行更深层次的学习,也就是从做题中获取知识, ...
- 图论与图学习(一):图的基本概念
图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构.检测欺诈.理解汽车租赁服务的消费者行为或进行实时推荐.近日,数据科学家 Maël Fabien ...
最新文章
- (一)检测浏览器是否支持websocket
- APACHE利用Limit模块限制IP连接数
- Python 计算各类距离
- 旧金山GDC2008见闻一
- 查看oracle 的数据文件的版本信息
- Q1:spring-boot中Controller路径无法被访问的问题
- Java编写程序将数据存入Kafka中
- 随机显示个性签名代码
- 问答| 在四轮驱动机器人(SSMR)运动学模型中,左右虚拟轮的线速度vl和vr如何得到?
- 语言(文化)代码与国家地区对照表,各国手机号正则
- Redisson分布式调度任务小栗子
- 打造云原生大型分布式监控系统
- 慕课网-安卓攻城狮视频学习及练习(六)
- 【PS基础】-照片拼接基础
- TODO List—2018今日头条校招
- 移远串口调试软件QCOM下载
- 跟网络游戏,手机APP游戏告别
- Python_模拟登陆新浪微博
- 从真假美猴王谈起 - 让套牌车、克隆x 无处遁形的技术手段思考
- Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录...