陈越-数据结构
DFS(Depth First Search, DFS)
深度优先搜索
搜索完后“原路返回”->出栈
伪码描述:
void DFS(Vertex V){
visited[V] = true;//标记为访问过
for(V的每个邻接点W){
if(!visited[W])
DFS(W);
}
}
类似于树的先序遍历。
对于N个顶点,E条边,时间复杂度
- 用邻接表存储图 O ( N + E ) O(N+E) O(N+E)
- 用邻接矩阵存储图 O ( N 2 ) O(N^2) O(N2)
BFS(Breadth First Search)
广度优先搜索
类似于树的层序遍历
无递归!
void BFS(Vertex V){
visited[V] = true;
enqueue(V,Q);//该顶点入队
while(!isempty(Q)){
V = Dequeue(Q)//这个和函数输入的V都没啥关系了。。叫别的都行
for(V的每个邻接点M){
visited[M] = true;
enqueue(M,Q);
}
}
}
对于N个顶点,E条边,时间复杂度
- 用邻接表存储图 O ( N + E ) O(N+E) O(N+E)
- 用邻接矩阵存储图 O ( N 2 ) O(N^2) O(N2)
其他
在不同情境下,两种方法各有好处
一堆概念:
连通、路径、简单的路径(没环)、回路、连通图、连通分量、强弱连通
如果有顶点不连通?(不连通图)
遍历顶点再访问一次。(外面加循环!不是DFS里面加!)