数据结构与算法-图

一、图的定义

一种非线性的数据结构,表示多对多关系;

线性表和树可以看作特殊的图;

线性表中数据元素称为元素,树中称为结点,图中数据元素称为顶点;

有空表,空树,没有空图,图中必须存在顶点;

线性表中元素是线性关系,树中元素是层次关系,图中各个顶点之间的关系是边;

二、图的分类

1.无向图

图的边上无方向

上图顶点集为{1, 2, 3, 4},边集为{(1,2),(2,4),(2,3),(3,4)}

1.1无向完全图

任意两个顶点之间都有边,则称为无向完全图

1.2连通图

在无向图中,从顶点A到顶点B之间有路径,称为连通图;

无向图中的极大连通子图称为连通分量

1.3无向图的度

顶点A的度是和其他顶点关联的边的数量

2.有向图

图的边上有方向

2.1有向完全图 

有向图中,任意两个顶点之间都存在方向互为相反的两条边,则称该图为有向完全图

2.2强连通图

对于某个图,每一对顶点A到B和从B到A都存在路径,则称为强连通图

极大连通子图称为有向图的强连通分量

2.3有向图的度

分为入度和出度,入度就是箭头指向本身的边数,出读就是指向其他顶点的边数,一个顶点的度为入度和出度相加

3.稀疏图和稠密图

按照边的多少来区分,图顶点为n,则边数大于n*logn,该图为稠密图,反之为稀疏图

4.有环图和无环图

路径:依次遍历顶点序列之间的边所形成的轨迹,有序

简单路径:没有重复顶点的路径

环:包含相同顶点两次或者以上的路径

有环图为图上有环,无环图为没有环

5.加权图和无权图

边上带有权重的图,称为加权图,否则称为无权图

三、图的存储结构

1.邻接矩阵

用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组存储图中边的信息

1.1无向图的邻接矩阵

是个对称矩阵

1.2有向图的邻接矩阵

同上,只是边改成有向,结果即为非对称矩阵

2.邻接表

由表头节点和表节点组成,每个顶点对应一个存储在数组中的表头节点,如果表头节点所对应的顶点存在邻接顶点,则把邻接节点依次存放于表头节点所指向的单向链表中

1.1无向图邻接表

顶点表组合为:下标/存储数据的数据域/存储指针的指针域,指针指向边表的第一个节点/边表节

边表组合为:一个邻接点域(用于存储数据的下标),一个指针域(存储指向下一个边表节点的指针)

1.2有向图邻接表

同无向图类似,只是多了方向用于表示出度

1.3逆邻接表

用于解决邻接表全局遍历查找入度的效率低下问题,将邻接表逆向展示

3.十字链表法(仅针对有向图)

结合了邻接表和逆邻接表,在顶点表新增了入和出的指针域,在边表节点,新增了起点下标,终点下标,入边指针域,出边指针域

4.邻接多重表(仅针对无向图)

对比十字链表,区别在于,没有入度出度的概念,所以只需在顶点表放置一个指针域,边表节点与十字链表一致

四、图的遍历

1.广度遍历

2.深度遍历

五、最小生成树

1.Prim算法(普利姆)

原理:从某一个顶点开始构建生成树,每次将代价最小的新顶点纳入生成树,直到所有顶点纳入完毕

2.Kruskal算法(克鲁斯卡)

原理:每次选择一条权值最小的边,使得这条边的两头连通(原本已经连通的不选),直到所有结点均连通为止

六、最短路径问题

1.Dijkstra算法(迪杰斯特拉)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_ForWard

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值