图的遍历
从图中某个指定的顶点出发, 按照某一原则对图中所有顶点都访问一次, 得到一个由图中所有顶点组成的序列,这一过程称为图的遍历
利用图的遍历,可以:
1、确定图中满足条件的顶点;
2、求解图的连通性问题,如求分量;
3、判断图中是否存在回路;
深度优先遍历(搜索)——DFS
深度优先遍历原则:
从图中某个指定的顶点v出发,先访问顶点v,然后从顶点v未被访问过的一个邻接点出发,继续进行深度优先遍历,直到图中与v相通的所有顶点都被访问(1);若此时图中还有未被访问过的顶点,则从另一个未被访问过的顶点出发重复上述过程,直到遍历全图。(递归过程)
(1)至此,完成一个连通分量的遍历;
图的深度优先遍历类似于二叉树的前序遍历;
要指定出发点,因为不同出发点最后得到的序列可能不同;
图示过程如下:
算法分析:
如果图中具有n个顶点、e条边,则
1、若采用邻接表存储该图,由于邻接表中有2e个或e个边结点,因而扫描边结点的时间为O(e);而所有顶点都递归访问一次,所以,算法的时间复杂度为O(n+e);
2、若采用邻接矩阵存储该图,则查找每一个顶点所依附的所有边的时间复杂度为O(n),因而算法的时间复杂度为O(n*n);
广度优先遍历(搜索)——BFS
广度优先遍历原则:
从图中某个指定的顶点v出发,先访问顶点v,然后依次访问顶点v的各个未被访问过的邻接点,然后又从这些邻接点出发,按照同样的规则访问它们的那些未被访问过的邻接点,如此下去,直到图中与v 相通的所有顶点都被访问(1);若此时图中还有未被访问过的顶点,则从另一个未被访问过的顶点出发重复上述过程,直到遍历全图。
(1)完成一个连通分量的遍历;
类似于树的按层次遍历;
可以使用队列来实现
图示过程如下:
算法分析:
1、采用邻接表存储该图:O(n+e);
2、采用邻接矩阵存储该图:O(n*n);
如何确定顶点不被重复访问
为了标记某一时刻图中哪些顶点是否被访问,定义一维数组visited[0…n-1],有