以下汇总均来源于:zzu信息工程学院数据结构课件
本文是概念性总结文章,包括图的定义和术语汇总、图的存储和遍历的概念。其中:图的存储和遍历算法会在另一篇文章:(【搜索与图论】树和图的存储与遍历算法实现)中给出。
1 图的定义和术语汇总
1.1 有向图和无向图
在讨论有向图和无向图时,我们约定以下两点:
- 顶点没有到自身的边/弧(没有自环)
- 与特定的两个顶点相关联的边不多于一条(没有重边)
容易错的一点是,在有向图中,要区分弧头和弧尾(以v1→v2为例):
- 初始点v1:也叫弧尾
- 终端点v2:也叫弧头
特别地:
- 有向完全图:
n
个顶点、有n(n-1)
条弧的有向图 - 无向完全图:
n
个顶点、有n(n-1)/2
条边的无向图
1.2 邻接关系
无向图中的邻接关系:如果边(v
,w
)∈E
v
和w
互为邻接点,或v
和w
相邻接- 边(
v
,w
)依附于顶点v
和w
,或边(v
,w
)与v
和w
相关联 - 和顶点
v
相关联的边的数目即v
的度,记为TD(v)
有向图中的邻接关系:
- 如果弧<
v
,w
> ∈E
,称v
邻接到w
或w
邻接自v
- 顶点
v
的入度:以v
为头的弧的数目,记为ID(v)
- 顶点
v
的出度:以v
为尾的弧的数目,记为OD(v)
- 顶点
v
的度TD(v)= ID(v)+ OD(v)
其中,一个有n
个顶点和e
条边或弧的图,满足:
1.3 连通性
1.4 无向连通图的生成树
我的答案:T F T T(欢迎质疑)
1.5 有向树、有向图的生成森林
注意:这里的绿色箭头并不是等价转换。
根据定义,有向图在转换成有向树时,需要:
- 删除某些有向边,使某个结点的入度为0作为根节点
- 保证其余结点入度为1
当然,并不是所有的有向图都可以转换成有向树,条件不符合时就只能转到森林了。
1.6 稀疏图和稠密图、权值和网
2 图的两种存储方式
- 邻接矩阵(数组表示法)
- 邻接表
2.1 邻接矩阵(数组表示法)
2.1.1 三个例子
分别是有向图、无向图、网的邻接矩阵存储表示。
2.1.2 邻接矩阵(数组表示法)的优缺点
2.2 邻接表
2.2.1 两个例子
邻接表是图的一种链式存储结构,适用于有向图和无向图。对图中每个顶点建立一个单链表,单链表中的结点表示依附于该顶点的边(对有向图来说是以该顶点为弧尾的弧)。
感受一下邻接表和邻接矩阵相对比,为什么更适合稀疏图?
2.2.2 邻接表的优缺点
3 图的两种遍历方式
定义:图的遍历是指从图中某个顶点出发遍访图中其余顶点,且使每个顶点仅被访问一次的过程。
意义:对非线性结构线性化。遍历算法是求解图的连通性、拓扑排序、求关键路径等算法的基础。
- 深度优先搜索DFS (Depth First Search)
- 广度优先搜索BFS (Breadth First Search)
3.1 BFS
3.1.1 BFS算法思想
3.1.2 BFS举例
3.1.3 BFS时间复杂度分析
3.2 DFS
3.2.1 DFS算法思想
3.2.2 DFS举例
3.3 图的遍历算法的应用
这些只是一部分,具体应用的算法题多了去了…
不过还是把课件这一部分加进来了:
- 利用图的遍历算法来判定一个无向图是否是连通图
- 利用图的遍历算法来得到生成树或生成森林