数据结构与算法 第9天(图)

一、图的定义和基本术语

当有向图中仅1个顶点的入度为0,其余顶点的入度均为1,此时是何形状?        是树

二、图的类型定义

三、二维数组存储(邻接矩阵)

定义

用一个一维数组存顶点       

 二位数组存两个顶点的关系,如果a,b两点之间有连线,记二维数组a,b为1

无向图的邻接矩阵

无向图的邻接矩阵是对称的,对角线元素为零        判断顶点度看横着有几个1

有向图邻接矩阵

如果v1到v2有连线,则v1,v2记1        可能不是对称的

初度等于第i行元素之和        入读列元素之和

网的邻接矩阵

元素用权表示

好处

直观、简单、好理解

方便检查任意一对顶点间是否存在边

方便找任一顶点的所有“邻接点”(有边直接相连的顶点)、

方便计算任一顶点的“度”(从该点发出的边数为“出度”,指向该点的边数为“入度”

缺点

不便于增加和删除顶点
浪费空间--存稀疏图(点很多而边很少)有大量无效元素

浪费时间--统计稀疏图中一共有多少条边

四、邻接矩阵建立

两个数组分别存储定点表和邻接矩阵

思路

(1)输入总顶点数和总边数。
(2)依次输入点的信息存入顶点表中。
(3)初始化邻接矩阵,使每个权值初始化为极大值。
(4)构造邻接矩阵。

算法

查找位置函数

无向图变化

五、链式存储(邻接表)

将顶点按照顺序存储在一维数组中,指针指向连接的点        

无向图邻接表

邻接表不唯一

若有n个顶点,e条边,则邻接表需要n个头节点,2e个表节点

有向图邻接表

邻接表        连着几个点入度就是几,出度需要遍历整个表        找出度容易,入读难

逆邻接表刚好想反        

特点

方便找任一顶点的所有“邻接点'

节约稀疏图的空间

对于无向图方便计算度

不方便检查任意一对对点间是否存在边

六、邻接表建立

头节点

边结点

思路

(1)输入总顶点数和总边数。

(2)建立顶点表
依次输入点的信息存入顶点表中

使每个表头结点的指针域初始化为NULL

(3)创建邻接表
依次输入每条边依附的两个顶点确定两个顶点的序号i和j,建立边结点将此边结点分别插入到v;和v;对应的两个边链表的头部

算法

七、邻接矩阵和邻接表的关系

联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。

区别:邻接表不唯一,邻接矩阵唯一

邻接矩阵的空间复杂度为O(n的平方),而邻接表的空间复杂度为O(n+e)。

用途:邻接矩阵多用于稠密图;而邻接表多用稀疏图

八、图的其他存储结构

十字链表

增加一个指针域指向入度        

邻接多重表

九、图的遍历

从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且
使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。

图中有回路,可以设置一个辅助数组visited[n]来避免重复访问

深度优先遍历DFS

类似树的先根遍历

一条路走到黑,走到底回退看看有没有别的路

邻接矩阵实现

时间复杂度O(n的平方)

广度优先遍历BFS

一层一层找        类似树的层次遍历

邻接表实现

时间效率O(n+e)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值