I. 阅读前你所需的基础知识

  1. 了解图 (graph) 的基本知识 (什么是顶点, 什么是边, 什么是路径等等)
  2. 了解图的深度优先遍历 (DFT, Depth-first Traversal)
  3. 了解有向图 (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) 来访问图内的所有元素,但针对有向图与无向图,我们有不同的检测方式

  • 检测无向图是否连通的步骤

    1. 将所有顶点标记为未访问
    2. 通过DFT访问所有顶点,被访问过的顶点标记为已访问
    3. 检测是否所有顶点都已被访问,若有顶点未被访问,则图不具有连通性
    • 伪代码
IsUndirectedGraphConnected(UndirectedGraph graph)
{//将graph内所有顶点标记为未访问MarkAllVerticeUnvisited(graph)//任取一个起始顶点,从它开始进行DFT,任何被遍历到的顶点会被标记为已访问currentVertex = any vertex in graphDFTMarkVisited(currentVertex)//检测是否所有顶点都被访问过,并返回结果     return AllVerticeAreVisited(graph)
}
  • 检测有向图是否强连通的步骤

    1. 将所有顶点标记为未访问
    2. 通过DFT访问所有顶点,被访问过的顶点标记为已访问
    3. 检测是否所有顶点都被访问,若有没被访问,则此图不是强连通有向图
    4. 复制一份当前的有向图
    5. 在复制的有向图内,将所有顶点标记为未访问
    6. 在复制的有向图内,把所有的边的方向反转,比如原来A指向B的边,变为B指向A
    7. 通过DFT访问复制的有向图内所有顶点,被访问过的顶点标记为已访问
    8. 在复制的有向图内,检测是否所有顶点都被访问,若有没被访问,则此图不是强连通有向图
    9. 如果第3与第8步均通过,则此图为强连通的有向图
    • 为什么要反转边的方向然后再测一次?:为了证明强连通性,我们必须确保一个点可以“到达所有的点”,还要确保所有的点“可以回到某一个点”,这也是有向图比无向图复杂的地方。

      • 一个简单的示例: 对于如下的有向图,假设我们以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
}
  • 检测有向图是否弱连通的步骤

    1. 获取当前图的无相基础图
    2. 检测无相基础图是否具有连通性
    • (因为弱连通的验证与基本与验证无向图的连通性相同,所以这里不加伪代码,唯一多的一步就是获取一个有向图的无相基础图)

作者:0 warning
参考资料:我的课堂笔记= =

【数据结构】无向图与有向图的连通性及相关算法相关推荐

  1. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

  2. 离散数学 --- 图论基础 --- 无向图的连通性和有向图的连通性

    第一部分 ---- 无向图的连通性 1.完全图:任意两个结点之间都有边 2.零图:所有结点都是孤立结点 3.平凡图:仅有一个结点的图 1.等价类:R是集合上的一个等价关系,选定集合中的任意一个元素a, ...

  3. 图的连通性 —— 连通性的相关知识

    图的连通性 -- 连通性的相关知识 [无向图的连通分量] 在无向图中,如果从节点vi 到节点vj 有路径,则称节点vi 和节点vj 是连通的.如果图中任意两个节点都是连通的,则称图G 为连通图.如下图 ...

  4. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  5. 无向图的关联矩阵JAVA_图的矩阵表示无向图及有向图的关联矩阵.doc

    图的矩阵表示 --无向图及有向图的关联矩阵 作者 邢雪芬 摘要:图论的内容丰富多彩,应用广泛,在许多学科中都有涉及图论的内容,篇是关于图论的一些小诠释,图的矩阵表示,无向图及有向图定义的声明和部分例题 ...

  6. 图----无向图、有向图

    1.无向图定义 图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成 边:edge 顶点:vertex 连通图:如果从任意一个顶点都存在一条路径到达另外一个任意顶点,我们称这幅图是连通图. 非连通 ...

  7. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

    三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi​:i 在原图中的度数 ...

  8. Gephi画无向图和有向图(显示节点和边序号)

    Gephi画无向图和有向图(显示节点和边序号) 数据形式 如果画无向图只要把Type这一列设置成undirected,不填入数据默认是directed 导入数据以后就可以设计节点以及边的属性了,如下: ...

  9. 数据结构无向图简单路径

    数据结构无向图简单路径 一.课程设计目的和要求 目的:锻炼学生对软件界面设计并进行实现的实践能力. 要求:(1)完成课程设计所给的所有功能. (2)根据课程设计的特点设计出相应的画面. 二.课程设计环 ...

最新文章

  1. 为什么vs数据库中文显示问号_本科论文知网不收录为什么会被知网查重到?
  2. java设计模式---备忘录模式
  3. 打分系统php_亚马逊的推荐系统是怎么实现的?
  4. 选择通过更改内容类型返回的详细程度,第二部分
  5. VS2010 + QT 5 +open inventor 环境配置
  6. php如何分词,关于php分词如何单独提取出来
  7. 说出来可能不信,现在酒厂都在招算法工程师
  8. 成都Uber优步司机奖励政策(3月28日)
  9. 使用Calender类获取系统时间和时间和运算
  10. Machine Learning - III. Linear Algebra Review线性代数 (Week 1, Optional)
  11. 华为手机解锁码计算工具_手机计算器全线阵亡?小编实测苹果、华为、三星……...
  12. python构造icmp数据包_Python原始套接字未接收ICMP数据包
  13. 服装:鲜嫩小衫 缔造甜美新时尚
  14. 使用python、java语言批量下载抖音中我的视频、我喜欢的视频,解析抖音视频,批量下载抖音...
  15. 算法之BFS算法框架
  16. 膝关节前交叉韧带重建术后取钉记
  17. 浅谈设计模式-依赖倒转(倒置)原则
  18. [世界杯] 韩国 vs 多哥 2:1
  19. python逻辑回归的主要参数_python机器学习(六)回归算法-逻辑回归
  20. Redis(十九),老男孩linux视频

热门文章

  1. 简易Java web在线聊天-websocket
  2. python 小说 小说_如何使用python上小说网爬网络小说?
  3. 杭电ACM 1003
  4. Java有参构造方法和无参构造方法
  5. 忘记网站登录密码不要慌,一招拯救你
  6. Neural-Motifs 运行环境配置
  7. ubuntu16.04为chrome浏览器安装flash插件(Adobe flash play不是最新版本)
  8. 微设计平台上微官网制作步骤
  9. Delphi 程序制作要点
  10. After Effects Guru: Creating Presets and Controllers After Effects 大师教程之创建预设和控制器 Lynda课程中文字幕