图的基本概念

Q: 图的数学定义是什么?
A: 图 由顶点集 和边集 组成, 记为 . 其中 , .

Q: 无向图的边和有向图的弧有什么区别?
A: 无向图的边是顶点的无序对, 而有向图的弧是顶点的有序对.

Q: 简单图与普通图的区别
A: 不存在重复边
不存在顶点到自身的边

Q: 完全图 (简单完全图) 的判断
A: - 是否是简单图
不用考虑不是简单图的情况, 现在学习的都是简单图

  • 是否是符合完全图的条件
    1. 用定义判断
      无向图: 任意两个顶点之间都存在边
      有向图: 任意两个顶点之间都存在方向相反的两条弧
    2. 用边的数量判断
      无向图: 有 条边
      有向图: 有 条边

Q: 完全图一定是连通图吗?
A: 是的, 根据完全图的定义, 任意两个顶点之间都存在边, 所以它必然是连通的.

Q: 有图为
子图的定义
A: 有图为 ,

的子图

Q: 有图为 , 子图为
生成子图的定义
A: 在子图的基础上再加一个条件
, 则 为生成子图

Q: V 和 E 的任何子集都能构成 G 的子图吗?
A: 错误
显然, 如果任意取 的子集
, 可能不满足图的定义
中很可能有边/弧为
而在 , 可能不存在 或者
图的定义不满足
图可以有度为 0 的点, 但不能有边/弧连接不存在的点

连通与强连通都是描述图连通的特性, 但是描述的对象不同
连通用来描述{c1: 无向图}
强连通用来描述{c1: 有向图}

Q: 极大连通子图的定义
A: 包含图中尽可能多的顶点以及尽可能多的边, 并且连通

Q: 连通分量与极大连通子图的关系
分为两种情况, 1. 图本身为连通图 2. 图本身为非连通图
A: 连通图: 连通分量=极大联通子图=连通图本身
非连通图: 连通分量=多个极大联通子图

Q: 什么是图的最大连通分量?
A: 在一个非连通图中, 包含顶点数最多的那个连通分量被称为最大连通分量.

Q: 生成树去掉一条边/添加一条边会发生什么?
A: 去掉一条边: 极小连通子图变为不连通
添加一条边: 出现一个回路

Q: n 个顶点的非连通图, 最多多少条边?
A: 由 个顶点组成一个完全图, 剩下一个点不相连
总数为

Q: 有 n 个顶点
最少多少边能构成一个无向连通图
A: 边最少的无向连通图为生成树/极小连通子图
最少要 n-1 条边

Q: 有 n 个顶点
最少多少边能构成一个有向连通图
A: 边最少的有向连通图为环
最少要 n 条边

Q: 连通图有唯一的极小连通子图吗?
A: 有多个不同的极小连通子图

Q: 什么样的图才能有极小连通子图呢?
A: 连通图
极小连通子图仅仅在连通图中有意义

Q: 极小连通子图的定义
A: 包含图的所有点, 且相互连通, 边最少, 不存在回路

若图有 个顶点, 则极小联通子图有 { }条边

Q: 怎样的图能够获得生成树?
A: 连通图

Q: 怎样的图能够获得生成森林?
A: 非连通图

Q: 生成树的获取
A: 连通图中的极小连通子图
(生成树与极小连通子图等价)

Q: 生成森林的获取
A: 图是非连通图
取其中的连通分量 (全部极大连通子图)
连通分量 (每个极大连通子图) 的生成树 (极小连通子图) 组成了连通森林

Q: 生成树与生成森林的关系
A: 多个生成树组成一个生成森林

Q: 如果一个图有 n 个顶点, 并且边的数量大于 n-1, 那么该图一定存在什么?
A: 该图一定有环.

Q: 对于一个连通图, 从任意顶点出发进行一次深度优先搜索 (DFS) 可以访问到所有顶点吗?
A: 可以.

有向图中
出度+入度={(总) 度}

图的储存及基本操作

Q: 在图的存储结构中, 哪些表示方法是唯一的, 哪些是不唯一的?
A: 邻接矩阵的表示是唯一的; 邻接表、十字链表和邻接多重表的表示是不唯一的.

设图 G 的邻接矩阵为
的元素 等于由顶点 到顶点 的长度为{}的路径的个数

邻接表法、十字链表和邻接多重表的共同存储特点是: 顶点结点之间采用{顺序存储}, 边结点之间采用{链式存储}.

图的遍历

Q: 什么样的路径序列被叫作简单路径?
A: 顶点不重复出现的路径称为简单路径

Q: 什么是图的简单回路?
A: 除了第一个顶点和最后一个顶点相同外, 其余顶点不重复出现的回路称为简单回路.

Q: 简单路径中是否包含回路?
A: 不包含.

BFS, DFS 与树的遍历
广度优先搜索的过程与树的{层次遍历}类似
深度优先搜索的过程与树的{先序遍历}类似

BFS/DFS 在使用邻接矩阵时的时间复杂度为{c1: }, 使用邻接链表时为{c1: }.

BFS/DFS 的空间复杂度为{c1: }, 与存储结构无关.

Q: 非带权图的单源最短路径问题使用 BFS 还是 DFS?
A: BFS

对同样一个图,
基于邻接矩阵的遍历得到的 DFS 序列和 BFS 序列{c1: 是}唯一的,
基于邻接表的遍历得到的 DFS 序列和 BFS 序列{c1: 不是}唯一的.

BFS 需要调用空间复杂度为{c1: }的{c1: 队列}
DFS 需要调用空间复杂度为{c2: }的{c2: 栈}

Q: 对一个连通图调用深度优先搜索 (DFS) 会产生什么? 如果图是非连通的呢?
A: 对连通图调用 DFS 会产生深度优先生成树; 如果图是非连通的, 则会产生深度优先生成森林.

Q: 除了拓扑排序, 还有什么遍历算法可以用来判断有向图是否存在环?
A: 深度优先遍历 (DFS) 算法.

Q: 图的广度优先生成树的树高与深度优先生成树的树高比较
A: 图的广度优先生成树的树高深度优先生成树的树高

图的应用

Q: 什么是最小生成树 (MST)?
A: 对于一个带权连通无向图, 其所有生成树中, 边的权值之和最小的那棵生成树就是最小生成树.

Q: Prim 算法和 Kruskal 算法的核心操作是什么?
A: Prim 算法从一个顶点开始, 不断选择代价最小的边来扩展生成树.
Kruskal 算法则从边出发, 不断加入权值最小且不会构成回路的边.

Q: Prim 算法和 Kruskal 算法得到的最小生成树什么时候相同?
A: 当图中没有权值相同的边时, 最小生成树唯一

Q: Prim 算法与 Krusal 算法分别适用于什么类型的图?
A: Prim: 边稠密
Kruskal: 边稀疏

Q: 对于不同的图存储结构, Prim 和 Kruskal 算法的复杂度分别是多少?
A: - Prim 算法使用邻接矩阵时, 时间复杂度为 .

  • Kruskal 算法使用邻接表时, 时间复杂度为 .

Q: 图论中的最短路径算法主要有哪些?
A: - BFS 算法: 用于无权图的单源最短路径.

  • Dijkstra 算法: 用于无负权值图的单源最短路径.
  • Floyd 算法: 用于求解每对顶点间的最短路径, 可以处理负权值但不能处理负权回路.

Q: Dijkstra 算法的核心思想是什么?
A: 每次找出到源点距离最近且未被访问过的顶点, 将其归入已确定最短路径的集合, 并用这个点去更新源点到其他所有未访问顶点的距离.

Q: Dijkstra 算法的时间复杂度是多少? 它受图的存储结构影响吗?
A: 时间复杂度为 , 它不受邻接矩阵或邻接表存储结构的影响.

Q: Floyd 算法的核心思想是什么?
A: Floyd 算法通过动态规划思想, 每次尝试引入一个新顶点作为中间点, 来更新图中任意两点间的最短路径.

Q: Floyd 算法的时间复杂度是多少?
A: .

Q: BFS 算法可以用来求解哪种图的单源最短路径问题?
A: 无权图 (或所有边权值相同的图).

Q: 什么是 DAG 图?
A: 有向图中不存在环

Q: 拓扑排序的两种定义是什么?
A: - 图论定义: 一个有向无环图 (DAG) 的拓扑排序是其所有顶点的一个线性序列, 该序列满足: 1) 每个顶点出现且只出现一次; 2) 若图中存在从顶点 A 到顶点 B 的路径, 则在序列中 A 必在 B 之前.

  • 直接定义: 拓扑排序是 DAG 顶点的一种排序, 使得所有有向边都从序列中较前的顶点指向较后的顶点.

Q: 拓扑排序的时间复杂度与图的存储结构有关吗?
A: 有关. 采用邻接表存储时为 , 采用邻接矩阵存储时为 .

Q: 对图进行深度优先遍历 (DFS) 可以得到拓扑排序吗?
A: 可以.

Q: 在什么情况下, 一个图的拓扑排序结果通常不唯一?
A: 当图中某个顶点有多个直接后继时, 拓扑排序的结果通常不唯一.

Q: 在什么情况下, 一个图的拓扑排序结果是唯一的?
A: 当图中每个顶点都有唯一的前驱和后继关系时, 拓扑排序的结果是唯一的.

Q: AOV 网和 AOE 网的主要区别是什么?
A: AOV (Activity on Vertex) 网中的边没有权值, 主要表示活动间的优先关系; AOE (Activity on Edge) 网中的边有权值, 通常表示活动持续的时间.

在 AOE 网中, 关键活动是指{e=l}的活动, 其中 e 是活动的最早开始时间, l 是活动的最晚开始时间.

Q: 什么是关键路径?
A: 从源点到汇点路径长度最长的路径.

Q: 在 AOE 网中, 如何计算各个事件的最早发生时间 (ve) 和最晚发生时间 (vl)?
A: - 求 ve: 从源点开始进行拓扑排序, ve (j) = max{ve (i) + weight (i, j)}, 其中 (i, j) 是以 j 为终点的所有活动.

  • 求 vl: 从汇点开始进行逆拓扑排序, vl (i) = min{vl (j) - weight (i, j)}, 其中 (i, j) 是以 i 为起点的所有活动.

Q: 在一个带权图的最小生成树中, 某条边的权值是否可能超过未被选中的边的权值?
A: 可能. 最小生成树保证的是总权值最小, 而不是选择的每一条边都是局部最小的.

使用 DFS 算法遍历有向无环图 (DAG) 时, 如何得到拓扑有序和逆拓扑有序序列?
A: - 递归结束前输出顶点信息: 得到逆拓扑有序序列.

  • 递归结束后输出顶点信息: 得到拓扑有序序列.

Q: 在无向连通图中, 如果没有权值相同的边, 它的最小生成树是否唯一?
A: 是, 唯一.

Q: 最短路径中可以有环的存在
A: 可以, 只要这个环不是负权环.

Q: 判断一个有向图是否有环的常用方法有哪些?
A: 深度优先遍历 (DFS) 和拓扑排序.

有向图中入度为 0 和出度为 0 的顶点都仅有 1 个是拓扑有序序列唯一的{充分不必要条件}

Q: 如何缩短一个工程的关键路径? (一条和多条)
A: - 如果只有一条关键路径, 缩短该路径上的任意一个关键活动即可.

  • 如果有多条关键路径, 必须同时缩短每一条关键路径上的活动.