首页 > 其他分享 >sj结构 - 图

sj结构 - 图

时间:2023-04-03 19:44:42浏览次数:28  
标签:连通 有向图 text 邻接矩阵 sj 邻接 顶点 结构

图(Graph)

P210

I 定义

\[\text{Graph}=(V,E) \]

其中

\[V= \lbrace x|x\in \text{Data Object} \rbrace \]

是数据元素的集合, 一般被称为顶点(Vertex).
另外:

\[E= \lbrace (v,w)|v,w\in V \rbrace \\ \text{or} \\ E= \lbrace \langle v,w \rangle |(v,w\in V)\wedge (\text{Path}(v,w)) \rbrace \]

表示数据元素之间的关系, 也叫边(edge)集合;
\(\text{Path}(v,w)\) 表示从顶点 \(v\) 到顶点 \(w\) 的一条单向通路, 它有方向.

  • 无向图: \((v,w)\) 无序
  • 有向图: \(\langle v,w \rangle\) 有序

P211

对图进行一些限制:

  1. 图中不能有自身环
  2. 两个顶点之间相关联的边不能多余一条.

II 术语

P212

  1. 完全图(complete graph)
    \(n\) 个顶点的无向图有 \(n(n-1)/2\) 条边, 则被称为完全无向图;
    \(n\) 个顶点的有向图有 \(n(n-1)\) 条边, 则被称为完全有向图;

  2. 权(weight)
    边上的相关系数. 带权图也被称为网络(network).

  3. 邻接点(adjacent vertex)
    若 \((v,w)\) 是无向图 \(\text{G}\) 中的一条边, 则称 \(v\) 与 \(w\) 互为邻接顶点, 且边 \((v,w)\) 称为依附于顶点 \(v\) 和 \(w\).
    若 \(\langle v,w \rangle\) 是有向图 \(\text{G}\) 中的一条弧, 则称顶点 \(v\) 邻接到顶点 \(w\) (也称 \(v\) 是 \(w\) 的前驱, ..., 弧 \(\langle v,w \rangle\) 与顶点 \(v\) & \(w\) 相关联).

  4. 子图(subgraph)
    设有两个图 \(\text{G}=(V,E)\) 以及 \(\text{G}'=(V',E')\),
    若 \(V'\subseteq V\) 并且 \(E'\subseteq E\) ,
    则称 \(\text{G}'\) 是 \(\text{G}\) 的子图.

  5. 顶点的度(degree)
    无向图中, 顶点 \(v\) 的度等于依附于顶点 \(v\) 的边的条数, 记作

    \[\text{TD}(v) \]

    有向图中, 以 \(v\) 为起始点的有向边条数称为顶点 \(v\) 的出度, 记作

    \[\text{OD}(v) \]

    以顶点 \(v\) 为终点的有向边条数称为顶点 \(v\) 的入度, 记作

    \[\text{ID}(v) \]

    有向图中顶点 \(v\) 的度数为入度和出度之和:

    \[\text{TD}(v)=\text{ID}(v)+\text{OD}(v) \]

    一般的, 设图 \(\text{G}\) 中有 \(n\) 个顶点, \(e\) 条边(或弧), 则有:

    \[e=\frac{\text{TD}(v_1)+\text{TD}(v_2)+\cdots+\text{TD}(v_n)}{2} \]

  6. 路径(path)
    在图 \(\text{G}=(V,E)\) 中, 若从顶点 \(v_i\) 出发, 沿一些边(或弧)经过一系列顶点 \(v_{p1},v_{p2},\cdots,v_{pk}\) 最终达到顶点 \(v_j\) , 则称顶点序列 \((v_i,v_{p1},v_{p2},\cdots,v_{pk},v_j)\) 为顶点 \(v_i\) 到顶点 \(v_j\) 的一条路径.

  7. 路径长度(path length)

    对于不带权的图, 路径长度为路径上边的数目;
    对于带权图, 路径长度为各边上权之和.

  8. 简单路径与回路(cycle)
    若路径上各点均不相同, 则称为简单路径;
    若路径上第一个顶点和最后一个相同, 则称该路径为回路或环.

  9. 连通图与连通分量(connected graph and connected component)
    无向图中, 若两顶点间存在路径, 则称这两个顶点是连通的.
    如果无向图中任意两个顶点都是联通的, 则称此无向图是连通图.
    非连通图的极大连通子图(包括所有连通的顶点和这些顶点依附的所有的边)叫做连通分量.

  10. 强连通图与强连通分量(strongly connected digraph)
    有向图中, 对于两个顶点 \(v_i\) 和 \(v_j\) , 若同时存在 \(v_i\) 到 \(v_j\) 和 \(v_j\) 到 \(v_i\) 的路径, 则称 \(v_i\) 和 \(v_j\) 是强连通.
    若有向图中任意两个顶点都是强连通的, 则称此有向图为强连通图.
    非强连通图的极大强连通子图叫做强连通分量. 单个顶点可以组成一个子图.

  11. 生成树(spanning tree)
    一个连通图的生成树是它的极小连通子图, 包含图中全部 \(n\) 个顶点和仅使这 \(n\) 个顶点连通的 \(n-1\) 条边.
    如果一个有向图只有一个入度为 \(0\) 的顶点, 其他顶点入度均为 \(1\) , 则这个有向图为有向树.
    一个有向图的生成森林由若干棵有向树组成, 生成森林含有图中所有顶点, 且只有足以构成若干棵树互不相交的有向树的弧.

III 图的基本操作

P213

参考文件 Graph.h , 定义了图的抽象类和方法.

IV 图的储存结构

1 邻接矩阵(Adjacency Matrix)

需要一个顶点矩阵记录每个顶点信息, 还需要一个矩阵表示各顶点之间的关系, 称为邻接矩阵.
设图 \(\text{G}=(V,E)\) 是一个有n个顶点的图, 则图的邻接矩阵是一个二维数组 \(\text{Arcs}[n][n]\) , 其定义为:

\[\text{Arcs}[i][j]= \begin{cases} 1, & \text{if } \langle i,j \rangle \in E \text{ or } (i,j) \in E \\ 0, & \text{otherwise} \end{cases} \]

下图给出了无向图和有向图邻接矩阵的示例:

Graph_01

从上图可以发现, 无向图的邻接矩阵一定是对称矩阵, 顶点 \(v_i\) 的度就是第 \(i\) 行或第 \(j\) 列累加之和, 即:

\[\text{TD}(v_i)=\sum_{j=0}^{n-1}\text{Arcs}[i][j]+\sum_{j=0}^{n-1}\text{Arcs}[j][i] \]

有向图的邻接矩阵不一定对称. 若 \(\text{Arcs}[i][j] = 1\) , 则表示有一条从顶点 \(v_i\) 到 \(v_j\) 的有向边.
第 \(j\) 列的所有元素值累加之和就是顶点 \(v_j\) 的入度:

\[\text{ID}(v_j)=\sum_{i=0}^{n-1}\text{Arcs}[i][j] \]

第 \(i\) 行的所有元素值累加之和就是顶点 \(v_i\) 的出度:

\[\text{OD}(v_i)=\sum_{j=0}^{n-1}\text{Arcs}[i][j] \]

有向图的不连接用无穷表示!

2 邻接表 (Adjacent List)

邻接表是邻接矩阵的改进。当图中的边数很少时,邻接矩阵中会出现大量的零元素,
为了存储这些零元素,将耗费大量的存储空间。为此,可以把邻接矩阵的每一行改为一
个单链表。

Graph_02
Graph_03

需要注意的是, 有向图的邻接表连出的边表示的是出度, 而逆连接表表示的是入度.

3 邻接多重表

在无向图的邻接多重表中, 图的每一条边用一个边结点表示, 它由六个域组成:

  • tag 是标记域, 标记该边是否被处理或被搜索过;
  • weight 为边的信息域, 用于存储边的权值;
  • adjvert1adjvert2 是顶点域, 表示该边所依附的两个顶点在图中的序号;
  • nextarcl 是边指针, 指向下一条依附于顶点 adjvert1 的边;
  • nextarc2 也是边指针, 指向下一条依附于顶点 adjvert2 的边;

对图中的每一个顶点用一个顶点结点表示, 它有两个域组成:

  • data 域存储有关顶点的信息;
  • firstarc 域是链接指针, 指向第一条依附于该顶点的边;

所有的顶点结点组成一个顺序表。

Graph_04

4 十字链表

十字链表是有向图的一种链式存储结构.
十字链表把两个合有向图的邻接表和逆邻接表合二为一,用有向图的邻接多重表(通常称为十字链表)表示.

Graph_05

十字链表是储存专用的储存结构(实际上就是邻接多重表).

标签:连通,有向图,text,邻接矩阵,sj,邻接,顶点,结构
From: https://www.cnblogs.com/jamesnulliu/p/sjstructure-graph.html

相关文章

  • 第06章 索引的数据结构
    1.为什么使用索引索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全表......
  • 类(class)和结构(structure)的认识
    本文复制了MSDNlibrary的原话,觉得它说得有道理,狠经典原话:类和结构是.NETFramework中的常规类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等(本主题后......
  • opencv-python 4.9.4. 轮廓:层次结构
    理论在最近几篇关于轮廓的文章中,我们使用了与OpenCV提供的轮廓相关的几个函数。但是当我们使用cv.findContours()函数在图像中找到轮廓时,我们已经传递了一个参数ContourRetrievalMode。我们通常传递cv.RETR_LIST或cv.RETR_TREE,它运行的效果很好。但它究竟意味着什么?此外,在输出......
  • 重学Java设计模式-结构型模式-代理模式
    重学Java设计模式-结构型模式-代理模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-16-重学Java设计模式《实战代理模式》.html#重学-java-设计模式-实战代理模式「模拟mybatis-spring中定义dao接口-使用代理类方式操作数据库原理实现场景」代理模式介绍......
  • 【LabVIEW】程序结构-条件/选择结构
    LabVIEW学习笔记汇总链接【LabVIEW】小白入门学习笔记-汇总目录1.基本使用2.加法小程序图示3.labview的编程特点4.平铺式顺序结构5.整理程序6.快捷键条件结构或选择结构条件结构简介选择结构的选择器接线端确定要执行的分支,接线类型有布尔型、数值型、字符串型......
  • 【LabVIEW】程序结构-事件结构
    LabVIEW学习笔记汇总链接【LabVIEW】小白入门学习笔记-汇总目录1.基本使用2.加法小程序图示3.labview的编程特点4.平铺式顺序结构5.整理程序6.快捷键事件结构事件结构概述事件结构:labview的精髓上方:事件分支框左侧:添加事件结构-控制布尔小灯亮灭后面......
  • 【LabVIEW】程序结构-禁用结构
    LabVIEW学习笔记汇总链接【LabVIEW】小白入门学习笔记-汇总目录1.基本使用2.加法小程序图示3.labview的编程特点4.平铺式顺序结构5.整理程序6.快捷键禁用结构禁用结构概述与文本语言中注释的功能类似,可以暂时屏蔽一段代码的执行事件结构中添加禁用结构后面......
  • C语言逆向——数组和结构体,数组多维只是一个编译构造的假象,本质会转成一维数组,结构体
    数组数组是C语言中非常重要的一个概念,学习C语言主要就是两个知识点:数组、指针,学好这两个,那么你的C语言一定也会很好。什么是数组?或者说什么情况下我们需要使用数组,比如说我们需要定义一个人的年龄,我们可以定义一个变量来表示,但是如果我们需要定义三个人的年龄呢?那就需要三个变......
  • 数据结构 第三章 栈与队列
    之前期末考试,大部分都是二叉树,先根遍历之类的,还有一些辨析题目,一些很零碎的知识点,关于二叉树,这些的栈1.栈的概念首先对于线性表来说,线性表的插入和删除操作可以在任意的位置进行,而栈的插入和删除操作只允许在表的尾端进行。栈中,允许进行插入和删除操作的一端称为栈顶,另一端称......
  • 结构体、联合体、枚举
    结构体:structStudent{charname[32];intage;intsex;charadd[32];};上面只是一种数据类型(同int、char基本类型一样),表示是一个结构体,不占用地址空间,只有在定义结构体变量时才分配空间,即structStudentstu1;stu1才占有地址空间。 联合体(共用体):有时同......