一、图的定义和基本术语
当有向图中仅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)