一、与树的深度优先遍历之间的联系
1.类似于树的先根遍历。
递归访问各个结点:
2.图的深度优先遍历
先设置一个数组,初始值全部设置为false,先访问一个结点,在用一个循环,依次检查和这个结点相邻的其他结点,在进行更深一层的访问。
如果是一个非连通的图,则无法遍历完所有结点。 改进方法和广度优先遍历相似。重新读取数组,查看是否还有false的顶点,有,则进行访问,没有则结束。
二、复杂度分析
空间复杂度:来自函数的调用,最坏的情况,递归深度为O(|V|) 最好为O(1)
时间复杂度 = 访问各结点所需的时间+探索各边所需的时间。
邻接矩阵存储的图的时间复杂度=O(|V|^2)
邻接表存储的图的时间复杂度= O(|V|+|E|)
三、深度优先生成树
和广度优先遍历相同, 同一个图的邻接矩阵表示方式唯一,深度优先遍历唯一。
同一个图邻接表方式不唯一,深度优先遍历序列不唯一。
深度优先生成树: 与广度一样,去掉多余的边
同一个图的邻接矩阵表示方式唯一,深度优先遍历唯一,深度优先生成树也唯一。
同一个图邻接表方式不唯一,深度优先遍历序列不唯一,深度优先生成树也不唯一。
四、图的遍历和图的连通图
对于无向图:进行BFS/DFS遍历调用BFS/DFS函数的次数=连通分量数
对于连通图,只需调用1次 BFS/DFS
对有向图进行BFS/DFS遍历
调用BFS/DFS函数的次数要具体问题具体分析
若起始顶点到其他各顶点都有路径,则只需调用1次BFS/DFS 函数
对于强连通图,从任一结点出发都只需调用1次 BFS/DFS总结: