一、图的定义
一种非线性的数据结构,表示多对多关系;
线性表和树可以看作特殊的图;
线性表中数据元素称为元素,树中称为结点,图中数据元素称为顶点;
有空表,空树,没有空图,图中必须存在顶点;
线性表中元素是线性关系,树中元素是层次关系,图中各个顶点之间的关系是边;
二、图的分类
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算法(迪杰斯特拉)