【数据结构】无向图与有向图的连通性及相关算法
I. 阅读前你所需的基础知识
- 了解图 (graph) 的基本知识 (什么是顶点, 什么是边, 什么是路径等等)
- 了解图的深度优先遍历 (DFT, Depth-first Traversal)
- 了解有向图 (directed graph) 与 无向图 (undirected graph)
II. 连通性(Connectedness)
无向图的连通性
- 无向图内的顶点连通性: 若有一条路径包含顶点A和顶点B,那么顶点A与顶点B互相连通
- 无向图的连通性:若图像内,任意取两个顶点都是互相连通的,那么则称此无向图是连通的
- 连通的无向图示例:下图是一个具有连通性的无向图,刚接触的人乍一看或许会认为"A和D之间根本就没有连接",但这时就要注意顶点的连通性了,我们需要的不是A与D,而是存在一条路径,包含A与D,那么这条路径自然是存在的,即为A-B-C-D
有向图的连通性
有向图的连通性:与无向图不同的,有向图分为强连通 (strongly connected) 与弱连通 (weakly connected),下面会逐个解释
有向图的强连通:对于图像内任意两个顶点A和顶点B,若存在一个A到B的路径并存在一个B到A的路径,那么称此有向图为强连通
强连通有向图示例:如下图,对于任意两个顶点存在相通的路径, 则此图像为强连通的有向图
有向图的弱连通:若此有向图的无相基础图具有连通性,那么称此有向图为弱连通
- 无相基础图 (underlying undirected graph) :移除一个有向图内所有边的方向性,可以理解为将有向图转变为了无向图
弱连通有向图示例:注意下面两张图,第一张图为有向图,第二张为其的无相基础图。这个图并不是强连通的有向图。我们用顶点A与顶点D为例,图像内存在A到D的路径,为A-B-C-D,但不存在D到A的路径,因为D不存在一个指向C的边。但是,它的无相基础图是连通的,所以此图为弱连通的有向图
III. 检测连通性的算法
对于连通性的检测,相对比较便利的方法就是使用深度优先遍历 (DFT) 来访问图内的所有元素,但针对有向图与无向图,我们有不同的检测方式
- 检测无向图是否连通的步骤:
- 将所有顶点标记为未访问
- 通过DFT访问所有顶点,被访问过的顶点标记为已访问
- 检测是否所有顶点都已被访问,若有顶点未被访问,则图不具有连通性
- 伪代码:
IsUndirectedGraphConnected(UndirectedGraph graph)
{//将graph内所有顶点标记为未访问MarkAllVerticeUnvisited(graph)//任取一个起始顶点,从它开始进行DFT,任何被遍历到的顶点会被标记为已访问currentVertex = any vertex in graphDFTMarkVisited(currentVertex)//检测是否所有顶点都被访问过,并返回结果 return AllVerticeAreVisited(graph)
}
- 检测有向图是否强连通的步骤:
- 将所有顶点标记为未访问
- 通过DFT访问所有顶点,被访问过的顶点标记为已访问
- 检测是否所有顶点都被访问,若有没被访问,则此图不是强连通有向图
- 复制一份当前的有向图
- 在复制的有向图内,将所有顶点标记为未访问
- 在复制的有向图内,把所有的边的方向反转,比如原来A指向B的边,变为B指向A
- 通过DFT访问复制的有向图内所有顶点,被访问过的顶点标记为已访问
- 在复制的有向图内,检测是否所有顶点都被访问,若有没被访问,则此图不是强连通有向图
- 如果第3与第8步均通过,则此图为强连通的有向图
- 为什么要反转边的方向然后再测一次?:为了证明强连通性,我们必须确保一个点可以“到达所有的点”,还要确保所有的点“可以回到某一个点”,这也是有向图比无向图复杂的地方。
- 一个简单的示例: 对于如下的有向图,假设我们以A为起点,只进行到第3步的检测,我们最后得出的结果是"此图是强连通的有向图"。然而我们明显看出,这个图是弱连通,因为E没有指向A的边。很明显,第一步只是证明了“A可以到达其他所有的顶点”,但没有证明“其他所有的顶点也可以到达A”。这时候,如果我们反转所有边的方向再次测试,就会发现A无法到达E,也就是变相说明“E无法到达A”。所以,这个图不是强连通的有向图
- 一个简单的示例: 对于如下的有向图,假设我们以A为起点,只进行到第3步的检测,我们最后得出的结果是"此图是强连通的有向图"。然而我们明显看出,这个图是弱连通,因为E没有指向A的边。很明显,第一步只是证明了“A可以到达其他所有的顶点”,但没有证明“其他所有的顶点也可以到达A”。这时候,如果我们反转所有边的方向再次测试,就会发现A无法到达E,也就是变相说明“E无法到达A”。所以,这个图不是强连通的有向图
- 伪代码:
IsDirectedGraphStronglyConnected(DirectedGraph graph)
{//将graph内所有顶点标记为未访问MarkAllVerticeUnvisited(graph)//任取一个起始顶点,从它开始进行DFT,任何被遍历到的顶点会被标记为已访问currentVertex = any vertex in graphDFTMarkVisited(currentVertex)//检测是否所有顶点都被访问allvisited = AllVerticeAreVisited(graph)if allvisited == false:return false//复制graphDirectedGraph copyedGraph = Copy(graph)//将复制的图内所有顶点标记为未访问MarkAllVerticeUnvisited(copyedgraph)//反转所有边的方向ReverseAllEdges(copyedGraph)//在复制的图里找到与currentVertex相等的顶点, 并对复制图进行DFTnewCurrentVertex = copyedGraph.FindTheSameVertex(currentVertex)DFTMarkVisited(newCurrentVertex)//检测是否所有复制图内的顶点都被访问allvisited = AllVerticeAreVisited(copyedGraph)if allvisited == false:return false//若以上检测全部通过,则此图为强连通有向图return true
}
- 检测有向图是否弱连通的步骤:
- 获取当前图的无相基础图
- 检测无相基础图是否具有连通性
- (因为弱连通的验证与基本与验证无向图的连通性相同,所以这里不加伪代码,唯一多的一步就是获取一个有向图的无相基础图)
作者:0 warning
参考资料:我的课堂笔记= =
【数据结构】无向图与有向图的连通性及相关算法相关推荐
- 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】
图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...
- 离散数学 --- 图论基础 --- 无向图的连通性和有向图的连通性
第一部分 ---- 无向图的连通性 1.完全图:任意两个结点之间都有边 2.零图:所有结点都是孤立结点 3.平凡图:仅有一个结点的图 1.等价类:R是集合上的一个等价关系,选定集合中的任意一个元素a, ...
- 图的连通性 —— 连通性的相关知识
图的连通性 -- 连通性的相关知识 [无向图的连通分量] 在无向图中,如果从节点vi 到节点vj 有路径,则称节点vi 和节点vj 是连通的.如果图中任意两个节点都是连通的,则称图G 为连通图.如下图 ...
- 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)
摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...
- 无向图的关联矩阵JAVA_图的矩阵表示无向图及有向图的关联矩阵.doc
图的矩阵表示 --无向图及有向图的关联矩阵 作者 邢雪芬 摘要:图论的内容丰富多彩,应用广泛,在许多学科中都有涉及图论的内容,篇是关于图论的一些小诠释,图的矩阵表示,无向图及有向图定义的声明和部分例题 ...
- 图----无向图、有向图
1.无向图定义 图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成 边:edge 顶点:vertex 连通图:如果从任意一个顶点都存在一条路径到达另外一个任意顶点,我们称这幅图是连通图. 非连通 ...
- 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi:i 在原图中的度数 ...
- Gephi画无向图和有向图(显示节点和边序号)
Gephi画无向图和有向图(显示节点和边序号) 数据形式 如果画无向图只要把Type这一列设置成undirected,不填入数据默认是directed 导入数据以后就可以设计节点以及边的属性了,如下: ...
- 数据结构无向图简单路径
数据结构无向图简单路径 一.课程设计目的和要求 目的:锻炼学生对软件界面设计并进行实现的实践能力. 要求:(1)完成课程设计所给的所有功能. (2)根据课程设计的特点设计出相应的画面. 二.课程设计环 ...
最新文章
- 为什么vs数据库中文显示问号_本科论文知网不收录为什么会被知网查重到?
- java设计模式---备忘录模式
- 打分系统php_亚马逊的推荐系统是怎么实现的?
- 选择通过更改内容类型返回的详细程度,第二部分
- VS2010 + QT 5 +open inventor 环境配置
- php如何分词,关于php分词如何单独提取出来
- 说出来可能不信,现在酒厂都在招算法工程师
- 成都Uber优步司机奖励政策(3月28日)
- 使用Calender类获取系统时间和时间和运算
- Machine Learning - III. Linear Algebra Review线性代数 (Week 1, Optional)
- 华为手机解锁码计算工具_手机计算器全线阵亡?小编实测苹果、华为、三星……...
- python构造icmp数据包_Python原始套接字未接收ICMP数据包
- 服装:鲜嫩小衫 缔造甜美新时尚
- 使用python、java语言批量下载抖音中我的视频、我喜欢的视频,解析抖音视频,批量下载抖音...
- 算法之BFS算法框架
- 膝关节前交叉韧带重建术后取钉记
- 浅谈设计模式-依赖倒转(倒置)原则
- [世界杯] 韩国 vs 多哥 2:1
- python逻辑回归的主要参数_python机器学习(六)回归算法-逻辑回归
- Redis(十九),老男孩linux视频
热门文章
- 简易Java web在线聊天-websocket
- python 小说 小说_如何使用python上小说网爬网络小说?
- 杭电ACM 1003
- Java有参构造方法和无参构造方法
- 忘记网站登录密码不要慌,一招拯救你
- Neural-Motifs 运行环境配置
- ubuntu16.04为chrome浏览器安装flash插件(Adobe flash play不是最新版本)
- 微设计平台上微官网制作步骤
- Delphi 程序制作要点
- After Effects Guru: Creating Presets and Controllers After Effects 大师教程之创建预设和控制器 Lynda课程中文字幕