图的基础知识请参阅相关书籍,这里列出考试时需要注意或容易忽视的地方。如有补充,欢迎评论或私信!
图的基本概念
1.图可以没有边,但不可以没有顶点。
2.有向完全图的任意两相邻顶点均有一对方向相反的边。
3.一个图G的子图G'并非需要连通,生成子图包含原图的全部顶点。
4.极大连通子图与极小连通子图:
- 极大连通子图是无向图的连通分量,该子图包含图中所有的边。
- 极小连通子图是既要保持图连通,包含全部顶点,同时该子图的边数最少的子图。
5.连通图的生成树是包含图中全部顶点的一个极小连通子图。因此,非全部顶点的子图一定不是生成树。
6.有向图某顶点v的度等于该顶点的入度与出度之和。
7.若从无向图的任意一个顶点出发进行DFS均可访问所有顶点,则该图一定是连通图。
8.存在回路的有向图必不存在拓扑序列。
9.从某图G任取一些顶点构成顶点集V',取一些边构成边集E',由V'和E'构成的图不一定是G'的子图,因为E'中边的两个结点不一定在V'这个顶点集中。
10.对于一个有n个顶点的图G:
- 若是连通无向图,则边数最少的情况是G是一棵树。
- 若是强连通有向图,则边数最少的情况是G构成一个有向环。
11.对于一个有n个顶点的图G:
- 若要保证图G在任何情况下均为连通图,则需要的边数至少为(含n-1个顶点的完全图的边数)+ 1,这保证了无论这些边如何分配,都能使得它们关联图中所有顶点(由反证易得)
图的存储及操作
1.邻接矩阵和邻接表对顶点的操作很方便。其中,邻接矩阵适用于稠密图;邻接表适用于稀疏图。
2.十字链表和邻接多重表对边的操作很方便。其中,十字链表适用于有向图;邻接多重表适用于无向图。
3.若邻接矩阵是三角阵,则图中必不存在环,即该图必存在拓扑序列。
4.对于有向图的邻接矩阵,第i行(列)非零元素的个数是第i个顶点的出度(入度)。
5.一个图的邻接矩阵表示唯一,邻接表表示不唯一。
- 使用邻接矩阵生成的广度优先生成树或森林与深度优先生成树或森林唯一,而使用邻接表则不唯一。
- 基于邻接矩阵的遍历所得到的DFS序列和BFS序列唯一,而基于邻接表的遍历所得到的DFS序列和BFS序列则不唯一。
6.画邻接矩阵时,若为无权图则用1表示两顶点关联,其余为0;若为带权图,则用数字表示权值,∞表示非关联,0表示到自身的权值。
7.画邻接表时,至少作出两个域——顶点标识与指向其关联顶点的指针,若为带权图,则应该增加数据域存储权值。
图的遍历与应用
1.不同方式存储的图的DFS与BFS的时间复杂度与空间复杂度:
邻接矩阵 | 邻接表 | |
DFS | O(|V|²) | O(|V|+|E|) |
BFS | O(|V|²) | O(|V|+|E|) |
无论是邻接表还是邻接矩阵,DFS和BFS的空间复杂度均为O(|V|).
2.利用DFS和求最短路径算法可以判断有向图中是否存在回路。
3.有向无环图的拓扑序列唯一,不可以唯一确定该图。
3.最小生成树不是唯一的,但最小生成树各边的权值之和总是唯一的。
4.无向连通图的最小生成树必存在。
5.最小生成树唯一时(各边权值不同),Prim算法与Kruskal算法得到的最小生成树相同。
5.最小生成树的两个算法:
- Prim算法:时间复杂度为O(|V|²),是从某一顶点开始,通过选取剩余顶点中距已选顶点最近的那个顶点构造最小生成树。由于该算法不依赖边,因而适用于边稠密图。
- Kruskal算法:若采用堆的方式存储,则时间复杂度为O(|E|log|E|),是从最小边开始,通过选取权值最小、两端顶点属于不同连通分量的边构造最小生成树。由于该算法不依赖顶点,因而适用于边稀疏而顶点较多的图。
6.最短路径的两个算法:
- Dijkstra算法:以顶点为中心,通过选取剩余顶点中距离源点最近的那个顶点并更新剩余顶点到源点的最短路径来寻找最短路径。
- Floyd算法:在第k轮更新所有顶点对(vi,vj)间的最短路径,其中最短路径的值为min{(vi,vj)的权值 , (vi,vk)与(vk,vj)的权值之和}
- 两算法时间复杂度均为O(|V|²),若是求每对顶点的最短路径,则为O(|V|³)
- Dijkstra算法不适用于含有负权值边的图,Floyd算法允许图中带有负权值的边,但不允许该负权值的边组成回路。
7.关键路径问题:
- 求取关键路径是以拓扑排序为基础的。
- 关键活动一定在关键路径上。
- 在AOE图中,关键路径上活动的时间延长多少,整个工程的时间也就随之延长多少。
- 缩短所有关键路径上共有的任意一个关键活动的持续时间可以缩短关键路径的长度。若某活动并不是该图中所有关键路径共有的,则它持续时间的缩短并不能缩短整个关键活动的持续时间;若活动a与活动b不是所有关键路径共有的,但它们覆盖了所有关键路径(即每一个关键路径必含活动a或活动b),则它们持续时间同时缩短就可以缩短整个关键活动的持续时间。
- 关键路径是一个顶点序列,而非活动(边)序列。
- 将实际工程问题抽象为关键路径问题时,实际问题中的工程与时间分别为关键路径中的活动(边)与权值,顶点需自行添加。