一、图的基本概念:图的基本概念、图的抽象数据类型
1、数据结构中仅讨论简单图,即图中不存在重复边、不存在顶点自己到自己的边;
2、完全图:
(1)对于无向图:任意两个顶点之间都存在边,若一个无向完全图有n个结点,则该无向完全图有n(n-1)/2条边;
(2)对于有向图:任意两个顶点之间都存在方向相反的两条弧,若一个有向完全图有n个结点,则该有向完全图有n(n-1)条边;
3、对于有向图和无向图来说,并不是边及和顶点集的任何子集都能构成G的子图,因为这样的子集可能不是图,即边集的子集中某些边关联的顶点可能不在顶点集的子集中。
4、无向图的极大连通子图成为连通分量;有向图的极大连通子图成为强连通分量;极大连通子图中不一定包括图中的所有顶点,只是要求包括尽可能多的顶点和边。
5、连通图的生成树是包含图中全部顶点的一个极小连通子图。
即图本身是连通的,要求生成树中需要包含该图的全部顶点且边的个数要尽可能少,即含有n个顶点的图的生成树中有n个顶点,n-1条边,保证树中没有环路出现;因此也说明极小连通子图中一定没有环路。
6、对于含有n个顶点的图,如果该图边的个数大于n-1那么该图一定有环路。
7、对于无向图来说任意顶点的入度等于出度,但有向图不一定;有向图所有顶点的入度之和等于所有顶点的出度之和。
8、对于含有n个顶点的图,若保证G在任何情况下都是连通的,则该图中至少有+1个顶点。
二、图的存储表示:邻接矩阵、邻接表、邻接多重表
三、图的遍历与连通性:深度优先搜索、广度优先搜索、连通分量
1、图的深度优先搜索类似于树的先序遍历,图的广度优先搜索类似于树的层序遍历。
2、基于邻接矩阵遍历得到的DFS序列和BFS序列是唯一的;基于邻接表的遍历得到的DFS序列和BFS序列是不唯一的;因为给定一个邻接矩阵则图的结点位置就确定了,而对于一个邻接表来说,可以得到多个结点位置不一样的图。
3、广度优先搜索需要借助一个辅助队列,因此广度优先搜索的空间复杂度为O(n);
深度优先搜索需要借助一个递归工作栈,因此深度优先搜索的空间复杂度为O(n);
其中,n为图中结点个数。
4、广度优先搜索和深度优先搜索的时间开销主要分为两部分:
访问各个结点和访问与各个结点相邻的边从而找到与该结点相邻的结点。
(1)广度优先搜索
基于邻接表遍历的时间复杂度为O(n+e)
基于邻接矩阵遍历的时间复杂度为O()
对于有向图和无向图结论均适用。
(2)深度优先搜索
基于邻接表遍历的时间复杂度为O(n+e)
基于邻接矩阵遍历的时间复杂度为O()
对于有向图和无向图结论均适用,其中n为图中结点个数,e为图中边的个数。
5、基于邻接矩阵的广度优先生成树/深度优先生成树唯一,基于邻接表的广度优先生成树/深度优先生成树不唯一。
6、在求给定边集和顶点集的图的广度优先遍历序列/深度优先遍历序列时,一定要先把图画出来,否则很容易做错。
7、若无向图是一个连通图,则只需要调用一次DFS/BFS就可以完成遍历;若无向图不是连通图,则对该无向图完成遍历所调用DFS/BFS的次数就是该无向图连通分量的个数。