DFS与BFS
2016-03-22 14:02
330 查看
1.深度优先搜索(DFS)
深度优先搜索类似于树的先序遍历,是树的先序遍历的推广。在图是连通的情况下,可以从图的任意v一顶点出发,访问该顶点,然后依次从v的没有被访问的邻接点进行同样的深度优先搜索。访问时需要定义一个布尔数组 visite[ i ]来记录第i个顶点是否访问过。递归和非递归代码如下:
非递归算法使用栈,在进栈前访问该接点,弹出栈顶元素v,然后访问v的没有访问过的邻接点并压入栈中。直到栈为空结束遍历。使用邻接表存储时间复杂度为O(n+e),而使用邻接矩阵来存时间复杂度为O(n^2).
2.广度优先搜索(BFS)
广度优先搜索类似于树的层次遍历,它是树的层次遍历的推广。首先从顶点i出发访问该结点,接着依次访问v的各个邻结点。然后分别从这些邻接点出发访问它们的邻结点。实现时使用队列。链接表存储实现如下:
void BFS(AdjList * Graph){
int i = 0,j;
queue<int>Q;
Enode*edge;
Q.push(i);
visit[i] = true; //访问之
while (!Q.empty()){
i = Q.front();
Q.pop(); //出队
edge = Graph->Vetex[i].firstedge;
while (edge){
j = edge->Advj;
if (!visit[j]){ //如果i的邻接点没有访问过就访问之并入队
visit[j] = true;
Q.push(j);
}
edge = edge->next;
}
}
}
非递归DFS与BFS代码完全类似,就是一个永栈一个使用队列。可以记住先访问之再如栈/队列。
深度优先搜索类似于树的先序遍历,是树的先序遍历的推广。在图是连通的情况下,可以从图的任意v一顶点出发,访问该顶点,然后依次从v的没有被访问的邻接点进行同样的深度优先搜索。访问时需要定义一个布尔数组 visite[ i ]来记录第i个顶点是否访问过。递归和非递归代码如下:
void DFS(int i){ visit[i] = true; //访问顶点 i for (遍历i的邻接点j){ if (!visit[j]) DES(j); //递归访问顶点j } }
void DFS(AdjList * Graph){ /*邻接表存储DFS非递归*/ int i = 0,j; stack<int> s; visit[0] = true; //初始接点访问之 s.push(i); Enode*edge; while (!s.empty()){ i = s.top(); s.pop(); edge = Graph->Vetex[i].firstedge; while (edge){ j = edge->Advj; if (!visit[j]){ //将没有访问过的邻接点压入栈 visit[j] = true; //进栈前访问之 s.push(j); //进栈 } edge = edge->next; } } }
非递归算法使用栈,在进栈前访问该接点,弹出栈顶元素v,然后访问v的没有访问过的邻接点并压入栈中。直到栈为空结束遍历。使用邻接表存储时间复杂度为O(n+e),而使用邻接矩阵来存时间复杂度为O(n^2).
2.广度优先搜索(BFS)
广度优先搜索类似于树的层次遍历,它是树的层次遍历的推广。首先从顶点i出发访问该结点,接着依次访问v的各个邻结点。然后分别从这些邻接点出发访问它们的邻结点。实现时使用队列。链接表存储实现如下:
void BFS(AdjList * Graph){
int i = 0,j;
queue<int>Q;
Enode*edge;
Q.push(i);
visit[i] = true; //访问之
while (!Q.empty()){
i = Q.front();
Q.pop(); //出队
edge = Graph->Vetex[i].firstedge;
while (edge){
j = edge->Advj;
if (!visit[j]){ //如果i的邻接点没有访问过就访问之并入队
visit[j] = true;
Q.push(j);
}
edge = edge->next;
}
}
}
非递归DFS与BFS代码完全类似,就是一个永栈一个使用队列。可以记住先访问之再如栈/队列。
相关文章推荐
- 构造Python中的常量类
- POJ 1753 Flip Game【枚举】
- POJ 1753 Flip Game【枚举】
- 谈谈native app和web app
- 从传递函数到差分方程的转换
- Visual Studio 2015 OpenMP: (2) reduction
- 对SQL SERVER数据类型理解最好的一篇文章
- python--基础学习(三)字符串单引号、双引号、三引号
- JavaScript 弹出框:警告(alert)、确认(confirm)以及提问(prompt)
- Go语言核心之美 2.6-常量
- 【POJ】1401 - Factorial(阶乘最后0的个数)
- 【翻译】Leapmotion-python开发官方文档(10)
- HDU 2066 一个人的旅行
- window Azure 部署java 应用
- Android听筒模式不同版本兼容
- VMWare 10 安装及使用上的问题
- 【uva11374】Airport Express 最短路
- TelephonyManager
- 仿QQ侧滑删除以及下拉刷新上啦加载?
- 获取本机ip(仅作为知识点记录)