欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多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搜索树,我们可以发现有两类节点可以成为割点:

  1. 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;
  2. 对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。

对于根结点,显然很好处理;但是对于非叶子节点,怎么去判断有没有回边是一个值得深思的问题。

我们用dfn[u]记录节点u在DFS过程中被遍历到的次序号,low[u]记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次序号最小),那么low[u]的计算过程如下:

low[u]={min{low[u], low[v]}min{low[u], dfn[v]}(u,v)为树边(u,v)为回边且v不为u的父亲节点low[u]={min{low[u], low[v]}(u,v)为树边min{low[u], dfn[v]}(u,v)为回边且v不为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)相关推荐

  1. neo4j python 算法_图论与图学习(二):图算法

    选自towardsdatascience 作者:Maël Fabien机器之心编译参与:熊猫 图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构.检 ...

  2. 图论算法 最短路程_图论与图学习(二):图算法

    选自towardsdatascience 作者:Maël Fabien 机器之心编译 参与:熊猫 图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构 ...

  3. 图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  4. [转载]图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  5. 图的割点 桥 双连通(byvoid)

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  6. 图的割点、桥和双连通分支的基本概念

    点连通度与边连通度 回到正题,首先介绍下什么是图的边连通度和点连通度.一般来说,点连通度是指对应一个图G,对于所有点集U属于V(G),也就是V(G)的子集中,使得G-U要么是一个非连通图,要么就是一个 ...

  7. 图的割点、桥与双连通分支的基本概念

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  8. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

  9. 图的割点 图的割边 二分图

    枯木逢春不再茂,年少且惜镜边人 这周准备完结阿哈算法,其中有一章的学习不是很熟练(总之学的慢,忘的快.哎,真的,学完得好好从背包开始复习了,等复习完了,准备进行更深层次的学习,也就是从做题中获取知识, ...

  10. 图论与图学习(一):图的基本概念

    图(graph)近来正逐渐变成机器学习的一大核心领域,比如你可以通过预测潜在的连接来理解社交网络的结构.检测欺诈.理解汽车租赁服务的消费者行为或进行实时推荐.近日,数据科学家 Maël Fabien ...

最新文章

  1. (一)检测浏览器是否支持websocket
  2. APACHE利用Limit模块限制IP连接数
  3. Python 计算各类距离
  4. 旧金山GDC2008见闻一
  5. 查看oracle 的数据文件的版本信息
  6. Q1:spring-boot中Controller路径无法被访问的问题
  7. Java编写程序将数据存入Kafka中
  8. 随机显示个性签名代码
  9. 问答| 在四轮驱动机器人(SSMR)运动学模型中,左右虚拟轮的线速度vl和vr如何得到?
  10. 语言(文化)代码与国家地区对照表,各国手机号正则
  11. Redisson分布式调度任务小栗子
  12. 打造云原生大型分布式监控系统
  13. 慕课网-安卓攻城狮视频学习及练习(六)
  14. 【PS基础】-照片拼接基础
  15. TODO List—2018今日头条校招
  16. 移远串口调试软件QCOM下载
  17. 跟网络游戏,手机APP游戏告别
  18. Python_模拟登陆新浪微博
  19. 从真假美猴王谈起 - 让套牌车、克隆x 无处遁形的技术手段思考
  20. Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录...

热门文章

  1. 浅谈OWASP TOP 10
  2. Mysql中contact、group_concat、concat_ws、repeat
  3. 网站移植到linux上后常犯的错误
  4. 转载:SPFA算法学习
  5. 利用openssl进行base64的编码与解码
  6. 接口XMPPConnection
  7. 外壳程序(shell):命令解释器commond
  8. 允许局域网内其他主机访问本地MySql数据库
  9. 看代码学知识之(1) 获取当前线程状态
  10. 字符串连接类(Javascript)