【数据结构(邓俊辉)学习笔记】图04——双连通域分解

文章目录

  • 0. 概述
  • 1 关节点与双连通域
  • 2 蛮力算法
  • 3 可行算法
  • 4 实现
  • 5 示例
  • 6 复杂度

0. 概述

学习下双连通域分解,这里略微有一点点难,这个算是DFS算法的非常非常经典的应用,解决的问题也非常非常有用。

1 关节点与双连通域

连通性很好理解,两个点在图中只要有一条路径,不管是无向的还是有向的,只要互相可达,就说他们是连通的。但有的时候会要求更严些,不仅要保证自己和某些地方的连通,还要保证某个区域不会变成独立的,另一个角度可以从关节点来理解。
在这里插入图片描述
明确下几个术语

考查无向图G。若删除顶点v后G所包含的连通域增多,则v称作切割节点(cut vertex)或关节点(articulation point)。
~  
如图C即是一个关节点——它的删除将导致连通域增加两块。反之,不含任何关节点的图称作双连通图。任一无向图都可视作由若干个极大的双连通子图组合而成,这样的每一子图都称作原图的一个双连通域(bi-connected component)。
~  
例如右上图中的无向图,可分解为右下图所示的三个双连通域。

任何一张连通的无向图都存在着若干个关键点,而且以这些关键点为界,可以将其分割为若干个双连通部分——BCC分量。

较之其它顶点,关节点更为重要。在网络系统中它们对应于网关,决定子网之间能否连通。在航空系统中,某些机场的损坏,将同时切断其它机场之间的交通。故在资源总量有限的前提下,找出关节点并重点予以保障,是提高系统整体稳定性和鲁棒性的基本策略。

那么怎么计算?给一个任意的图,如何将其分解为一个一个又一个BCC分量呢?作为查找结果的副产品——关键点,怎么得到?

2 蛮力算法

由其定义,可直接导出蛮力算法大致如下:

  1. 首先,通过BFS或DFS搜索统计出图G所含连通域的数目;
  2. 然后逐一枚举每个顶点v,暂时将其从图G中删去,并再次通过搜索统计出图G{v}所含连通域的数目。
  3. 于是,顶点v是关节点,当且仅当图G{v}包含的连通域多于图G。
    在这里插入图片描述
    这一算法需执行n趟搜索,耗时O(n(n + e)),如此低的效率无法令人满意。

3 可行算法

经DFS搜索生成的DFS树,表面上看似乎“丢失”了原图的一些信息,但实际上就某种意义而言,依然可以提供足够多的信息。

  • 先分析下根节点 情况
    在这里插入图片描述

DFS树中的叶节点,绝不可能是原图中的关节点

此类顶点的删除既不致影响DFS树的连通性,也不致影响原图的连通性。

此外,DFS树的根节点若至少拥有两个分支,则必是一个关节点。

如上图,在原无向图中,根节点R的不同分支之间不可能通过跨边相联(算法中为什么讨论cross edge?因为讨论的是有向图),R是它们之间唯一的枢纽。
~  

因此,这里也得出个结论:在无向图的DFS中是不可能有cross edge和forward edge,只有back word 回向边
~  
反之,若根节点仅有一个分支,则与叶节点同理,它也不可能是关节点。

  • 那么,又该如何甄别一般的内部节点是否为关节点呢?
    在这里插入图片描述
    考查上图中的内部节点C。若节点C的移除导致其某一棵(比如以D为根的)真子树与其真祖先(比如A)之间无法连通,则C必为关节点。反之,若C的所有真子树都能(如以E为根的子树那样)与C的某一真祖先连通,则C就不可能是关节点。

以D为根的真子树经过一系列访问后,会生成一系列tree edge和back edge,关键在于back edge。形象来说,若back edge往上指的不是那么高,准确来讲,不会高过父亲C,则C就是关键点。因为C若消失,则以D为根的真子树就会变成孤岛。

当然,在原无向图的DFS树中,C的真子树只可能通过后向边与C的真祖先连通。因此,只要在DFS搜索过程记录并更新各顶点v所能(经由后向边)连通的最高祖先(highest connected ancestor, HCA)hca[v],即可及时认定关节点,并报告对应的双连通域。

以E为根的真子树中的back edge往上指的更高,准确来讲,高过父亲C,则C就不是关键点。因为C若消失,则以E为根的真子树也会通过back edge保持连通。

因此通过遍历需要得到很重要指标 dTime 和 HCA,算法大体框架

  • 由括号引理: dTime越小的祖先,辈份越高
  • DFS过程中,一旦发现后向边(v,u) ~~~~      即取:hca(v) = min( hca(v) , dtime(u) )
  • DFS(u) 完成并返回v时 ~~~~      若有:hca(u) < dTime(v) ~~~~      即取:hca(v) = min( hca(v), hca(u) ) ~~~~      否则,即可判定:v系关节点,且 {v} + subtree(u) 即为一个BCC。
  • 那么如何实现?

4 实现

在这里插入图片描述
算法来看就是典型的DFS,这里改个名字叫BCC,这里利用闲置的fTime充当hca。

  • 看下u分别有哪些状态需要处理?
    首先看下UNDISCOVERED状态,既tree edge
    在这里插入图片描述
    在从顶点u处深入到遍历返回后之间的代码逻辑与DFS几乎一致,当遍历返回后,v的hca便已确定。故DFS搜索在顶点v的孩子u处返回之后,通过比较hca[u]与dTime[v]的大小,即可判断v是否关节点。
  1. 若hca[u] ≥ dTime[v],则说明u及其后代无法通过后向边与v的真祖先连通,故v为关节点。既然栈S存有搜索过的顶点,与该关节点相对应的双连通域内的顶点,此时都应集中存放于S顶部,故可依次弹出这些顶点。v本身必然最后弹出,作为多个连通域的联接枢纽,它应重新进栈。
  2. 反之若hca[u] < dTime[v],则意味着u可经由后向边连通至v的真祖先。果真如此,则这一性质对v同样适用,故有必要将hca[v],更新为hca[v]与hca[u]之间的更小者。

再看下DISCOVERED 和VISITED(这个状态只有有向边才有,这里可不关注,只是为了和DFS作对比)

在这里插入图片描述
当然,每遇到一条后向边(v, u),也需要及时地将hca[v],更新为hca[v]与dTime[u]之间的更小者,以保证hca[v]能够始终记录顶点v可经由后向边向上连通的最高祖先。

5 示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 复杂度

与基本的DFS搜索算法相比,这里只增加了一个规模O(n)的辅助栈,故整体空间复杂度仍为O(n + e)。时间方面,尽管同一顶点v可能多次入栈,但每一次重复入栈都对应于某一新发现的双连通域,与之对应地必有至少另一顶点出栈且不再入栈。因此,这类重复入栈操作不会超过n次,入栈操作累计不超过2n次,故算法的整体运行时间依然是O(n + e)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq单机安装及性能测试

RabbitMQ单机安装及性能测试 本文使用CentOS7.9安装RabbitMQ单机环境&#xff0c;并进行性能测试。 1. 安装RabbitMQ RabbitMQ依赖Erlang&#xff0c;版本配套关系参考官网&#xff1a;https://www.rabbitmq.com/docs/which-erlang。 本文安装RabbitMQ3.8.21,Erlang版本要求…

简单记录玩4399游戏flash插件问题

一、因谷歌浏览器默认禁止flash插件自动运行,所以玩家在使用谷歌浏览器,访问www.4399.com平台页面或者4399小游戏(flash资源)时,可能会出现加载异常的情况。今天教大家如何开启flash插件 二、下载falsh官方插件 地址:Flash Player官方下载中心-Flash中国官网 三、如果您…

ctfshow-web入门-命令执行(web30-web36)

目录 1、web30 2、web31 3、web32 4、web33 5、web34 6、web35 7、web36 命令执行&#xff0c;需要严格的过滤 1、web30 代码差不多&#xff0c;就是过滤的东西变多了&#xff1a; preg_match("/flag|system|php/i", $c) 这里不让用 system &#xff0c;我们…

掌握Excel字符串拼接

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在这个数字化时代&#xff0c;Excel已经成为了日常工作中不可或缺的工具。而字符串拼接作为Excel中的一项基本操作&#xff0c;对于提高工作效率、简化数据处理流程具有重要意义。本文将带你深入了解Excel字符串拼接…

离散数学答疑 4

知识点&#xff1a;什么是可结合&#xff1f; 举例A选项&#xff1a; 知识点&#xff1a;可交换性? 知识点&#xff1a;什么是阿贝尔群&#xff1f; 可交换->运算表中的元素关于主对角线对称 二阶子群的表达式 二阶子群作为一个群的子群&#xff0c;其本质是一个包含单位元…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 伐木工(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 伐木工(200分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

【机器学习】Qwen2大模型原理、训练及推理部署实战

目录​​​​​​​ 一、引言 二、模型简介 2.1 Qwen2 模型概述 2.2 Qwen2 模型架构 三、训练与推理 3.1 Qwen2 模型训练 3.2 Qwen2 模型推理 四、总结 一、引言 刚刚写完【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战 &#xff0c;阿里Qwen就推出了Qwen2&#x…

「前端+鸿蒙」鸿蒙应用开发-TS类-定义语法

在 TypeScript 中&#xff0c;类&#xff08;class&#xff09;是一种构建对象的结构&#xff0c;它允许你定义对象的属性和方法&#xff0c;并支持面向对象编程的基本特性&#xff0c;如封装、继承和多态。以下是 TypeScript 中类的定义和基本语法的快速入门指南。 TS快速入门…

MySQL之多表查询—表子查询

一、引言 上一篇博客学习了行子查询。&#xff08;看弹幕&#xff1a;同一张表用or,不同张表用union&#xff09; 下面接着学习子查询当中的最后一种——表子查询。 表子查询 1、概念 子查询返回的结果是多行多列&#xff0c;这种子查询称为表子查询。 2、常用的操作符 IN 3、…

46-2 护网溯源 - 企业在护网中如何溯源得分

一、企业部署蜜罐 蜜罐是什么? 蜜罐是一种网络安全工具,用于诱使攻击者前来攻击,以便收集关于攻击者行为、手段和意图的信息。 企业部署蜜罐技术旨在识别潜在的安全威胁,并采取相应的防御措施。蜜罐可以模拟各种服务和系统,如数据库服务器、Web服务器等,以便引诱攻击者。…

关于Redis中哨兵(Sentinel)

Redis Sentinel 相关名词解释 名词 逻辑结构 物理结构 主节点 Redis 主服务 一个独立的 redis-server 进程 从节点 Redis 从服务 一个独立的 redis-server 进程 Redis 数据节点 主从节点 主节点和从节点的进程 哨兵节点 监控 Redis 数据节点的节点 一个独立的 re…

Golang-编码加密-Xor(GG)

go语言环境搭建 Golang学习日志 ━━ 下载及安装_golang下载-CSDN博客 go run xxx.go go build xxx.go 首先,cs.msf生成比特流数据. 放入xor,py脚本中进行xor加密. xor.py def xor(shellcode, key):new_shellcode ""key_len len(key)# 对shellcode的每一位进行…

OJ3829大石头的搬运工

题目&#xff1a; 在一款名为”大石头的搬运“的游戏中&#xff0c;玩家需要操作一排 n 堆石头&#xff0c;进行 n -1 轮游戏。每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任意位置。在n-1轮移动结束时&#xff0c;要求将所有的石头移动到一起(即所有石头…

“抖动“ 与工作集

目录 "抖动" 的产生原因 "抖动" 产生的详细原因 "抖动" 的示例场景 解决"抖动" 的方法 缺页率与物理块数的关系 1. 缺页率与内存大小的关系 2. 虚拟内存技术 3. 缺页率与物理块数关系的分析 4. 示例图解 5. 管理策略 工作集…

Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路

技术背景 Android平台推流模块&#xff0c;添加文字或png水印&#xff0c;不是一件稀奇的事儿&#xff0c;常规的做法也非常多&#xff0c;本文&#xff0c;我们主要是以大牛直播SDK水印迭代&#xff0c;谈谈音视频行业的精进和工匠精神。 第一代&#xff1a;不可动态改变的文…

计算机网络9——无线网络和移动网络2无线个人区域网 WPAN

文章目录 一、蓝牙系统二、低速 WPAN三、高速 WPAN 无线个人区域网WPAN(Wireless Personal Area Network)就是在个人工作的地方把属于个人使用的电子设备(如便携式电脑、平板电脑、便携式打印机以及蜂窝电话等)用无线技术连接起来自组网络&#xff0c;不需要使用接入点AP&#…

【设计模式】创建型设计模式之 建造者模式

文章目录 一、介绍定义UML 类图 二、用法1 简化复杂对象具体构建过程省略抽象的 Builder 类省略 Director 类 三、用法2 控制对象构造方法、限制参数关系Guava 中使用建造者模式构建 cache 来进行参数校验 一、介绍 定义 建造者模式&#xff0c;将一个复杂的对象的构建过程与…

实用软件分享---简单菜谱 0.3版本 几千种美食(安卓)

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

MC联机无法连接到服务器怎么解决

MC联机无法连接到服务器&#xff1f;弹性云服务器来帮您解决&#xff01;在《我的世界》&#xff08;Minecraft&#xff0c;简称MC&#xff09;的联机冒险中&#xff0c;无法连接到服务器无疑是每个玩家最头疼的问题之一。无论是与好友组队探险&#xff0c;还是加入心仪的社区服…

Nginx-反向代理如何配置

反向代理 为服务响应方提供中转 正向代理 为服务请求方提供中转 后端的域名和ip要和反向代理的保持一致 加权轮询(weight1;)和ip_hash是不能一起用的 /usr/local/nginx/sbin/nginx -v //查看版本 反向代理 谁第一响应就解析谁 nginx-2的ip:192.168.241.10 安装nginx 启动…