算法基础——DFS(深度优先遍历)
来源:互联网 发布:mysql怎么创建索引 编辑:程序博客网 时间:2024/06/03 16:38
算法基础—DFS(深度优先遍历)
brycezou@163.com
1、算法思想
DFS的基本思想:从图的某个顶点开始,一路向前,当没有新的(未被访问的)顶点可访问时逐层回退,继续去发现新的顶点;直到源点可达的所有顶点都被访问为止。这一过程类似于树的前序遍历。
2、算法代码示例
本文基于图的邻接表形式,分别给出了递归版本和非递归版本的DFS算法代码。本代码旨在清晰地展示算法细节,而未进行任何优化,请多多包涵。
#include <iostream>#include <vector>#include <stack>using namespace std;//图的邻接表vector<vector<int> > graph;//递归的DFSvector<bool> visited;void dfs_recursive(int here){ cout<<here<<" visited"<<endl; visited[here] = true; for(int i = 0; i < graph[here].size(); i++) { int next = graph[here][i]; if(!visited[next]) dfs_recursive(next); }}//非递归的DFSvector<bool> visited_stk;void dfs_stack(int src){ stack<int> stk; stk.push(src); visited_stk[src] = true; //压栈就算是访问过了 cout<<src<<" visited"<<endl; while(!stk.empty()) { int curr = stk.top(); //访问栈顶元素 bool allvisited = true; //栈顶元素的邻居是否全被访问过 for(int i = 0; i < graph[curr].size(); i++) { int nbr = graph[curr][i]; //栈顶元素的第i个邻居 if(!visited_stk[nbr]) //如果没被访问过,就压栈并访问 { stk.push(nbr); visited_stk[nbr] = true; cout<<nbr<<" visited"<<endl; allvisited = false; break; } } if(allvisited) stk.pop(); }}int main(int argc, char *argv[]){ cout << "Hello DFS!" << endl; //图的邻接表 vector<int> n0,n1,n2,n3,n4,n5,n6; n1.push_back(2); n1.push_back(4); n2.push_back(5); n3.push_back(5); n3.push_back(6); n4.push_back(2); n5.push_back(4); n6.push_back(6); graph.push_back(n0); //占位符 graph.push_back(n1); graph.push_back(n2); graph.push_back(n3); graph.push_back(n4); graph.push_back(n5); graph.push_back(n6); cout<<"dfs with recursive"<<endl; visited = vector<bool>(graph.size(), false); for(int i = 1; i < graph.size(); i++) { if(!visited[i]) dfs_recursive(i); } cout<<endl<<"dfs with stack"<<endl; visited_stk = vector<bool>(graph.size(), false); for(int i = 1; i < graph.size(); i++) { if(!visited_stk[i]) dfs_stack(i); } return 0;}
0 0
- 算法基础——DFS(深度优先遍历)
- 第十二周项目三 图遍历算法实现——深度优先(DFS)遍历
- 详解ACM基础算法—DFS深度优先搜索算法
- 深度优先搜索——DFS遍历
- 深度优先搜索遍历(DFS)——邻接矩阵存储
- 第12周—项目3(1) 图遍历算法—实现深度优先遍历——DFS
- 图论基础-深度优先遍历DFS
- 第12周项目3-(1)图遍历算法实现、实现深度优先遍历—DFS
- 【算法导论】图的深度优先搜索遍历(DFS)
- 算法学习:图的深度优先遍历(DFS)
- DFS深度优先遍历算法简单分析
- DFS——深度优先搜索基础
- 深度优先搜索算法—DFS
- 深度优先遍历DFS
- DFS-深度优先遍历
- DFS深度优先遍历
- 深度优先遍历(DFS)
- DFS 深度优先遍历
- Spark概述
- Chrome控制台 : Explore and Master Chrome DevTools
- C语言模拟考|lower cases
- jsp之一个简单的计算器
- Android ViewPager使用详解
- 算法基础——DFS(深度优先遍历)
- Android文件File相关操作的一个工具类
- 《Hadoop 2.X HDFS源码剖析》读书笔记(DataNode)
- VR眼镜 开发 (九) Fov与头动矫正
- Hadoop 格式化namenode错误:FATAL namenode.NameNode: Exception innamenode join 解决办法
- 使用URL重写解决 Cookie被禁用,导致的用户Session遗失
- 深度学习性能提升的诀窍
- 1508-张晨曦总结《2016年-11月-5日》【连续15天总结】
- Unity 双击切换目标点