图
本章总结
考试不考十字链表和临界多重表,考试紫色的做要求,除了Dijkstra算法
图的概念
基本术语
抽象数据类型
大学表示集合,小写表示集合的元素
图的存储结构
邻接矩阵表示法(数组)
无向图
有向图
有权图
邻接矩阵的优缺点
代码实现
邻接表表示法(链式)
结构
无向图
有向图
逆邻接表可以使求度更容易
邻接表的优缺点
邻接矩阵与邻接表的对比
代码实现
十字链表表示法(尚未自学)
用一个链表来表示邻接表与逆邻接表
邻接多重表
概念
邻接多重表(adjacent multiList)是无向图(网)的另一种链式存储结构。
在此存储结构中,
图的顶点信息存放在顶点数组中,数组元素有两个域:
data域:存放与顶点相关的信息;
firstedge域:指向一个单链表,此单链表存储所有依附于该顶点的边的信息。
这些单链表的一个表结点对应一条边,表结点有六个域:
mark:为标志域,用来标记该边是否被访问过;
ivex和jvex:分别存放该边两个顶点在图中的位置;
ilink:指向下一条依附于顶点ivex的边对应的表结点;
jlink:指向下一条依附于顶点jvex的边对应的表结点。
info:该域存放该边相关的信息,实际上就是弧的权值,对于无向图,info域可省略;
适宜应用(与邻接表对比)
决邻接表存储无向图时同一条边要存储两次的问题。
邻接多重表主要用于存储无向图。因为如果用邻接表存储无向图,每条边的两个边结点分别在以该边所依附的两个顶点为头结点的链表中,这给图的某些操作带来不便。例如,对已访问过的边做标记,或者要删除图中某一条边等,都需要找到表示同一条边的两个结点。因此,在进行这一类操作的无向图的问题中,采用邻接多重表作存储结构更为适宜。
图的遍历
基本概念
深度优先搜索
算法思路
邻接矩阵实现
邻接表实现
两种方法效率分析
广度优先搜索
算法思路
邻接表实现
两种方法效率分析
图的其他运算
1、求图的生成树(或生成森林)
概念介绍
举例(生成树)
举例(生成森林)
2、求最小生成树
概念介绍
算法
Kruskal (克鲁斯卡尔)算法
1、不停的选最小的边进去,1->2->3->4->5,注意选边为5是不要构成环路
2、边是e条,但有个判断回路的过程,所以不是O(e)
Prim (普里姆)算法
先任选一个顶点,找最小的边,
这种算法无需判断回路
n为定点数
3、求最短路径
概念介绍(与最小生成树区分)
两种常见的最短路径问题:
单源最短路径-Dijkstra (迪杰斯特拉)算法
所有顶点间的最短路径一Floyd (弗洛伊德)算法
可以通过调用n次Dijkstra算法来完成,
时间复杂度为0(n3)
还有更简单的一一个算法: Floyd算法(略)
4、求关节点和重连通分量(略)
5、拓扑排序
6、求关键路径