我根据看别人的帖子总结的。这篇文章合适对深度优先遍历和广度优先遍历原理有一定了解的同志阅读,深度和广度这两个概念大家都知道的:图通过邻接表存储,深度就是有多少层,广度就是有多宽,两者原理上的区别是DFS优先纵向访问,BFS优先横向访问。

上代码自己领悟了:

//BFS DFS
#include<iostream>
#include<list>
using namespace std;//邻接表存储有向图:邻接表是图经常的存储方式。
class Graph{public:Graph(int V);void addEdge(int v,int w);//向图中添加一条边//BFS算法的实现void BFS();//BFS遍历//DFS算法的实现void DFS();//DFS遍历
private:int V;//顶点的数量list<int>*adj;//邻接表//BFS算法的实现void BFSUtil(int v,bool visited[]);//假设v可达所有顶点//DFS算法的实现void DFSUtil(int v,bool visited[]);//假设v可达所有顶点};
//构造函数
Graph::Graph(int V)
{this->V=V;adj=new list<int>[V];//初始化V条链表
}
//添加边,构造邻接表
void Graph::addEdge(int v, int w)
{adj[v].push_back(w);//对于无向//adj[v].push_back(w);//adj[w].push_back(v);
}
//从顶点出发BFS
void Graph::BFSUtil(int v, bool visited[])
{//BFS辅助队列list<int>queue;//将当前节点标记为已访问并压入队列visited[v]=true;queue.push_back(v);list<int>::iterator ite;while(!queue.empty()){v=queue.front();cout<<v<<" ";queue.pop_front();//检测已出队的顶点s的所有邻接点//若存在尚未访问的邻接点,访问并压入队列for(ite=adj[v].begin();ite!=adj[v].end();ite++){if(!visited[*ite])//如果未被访问,注意迭代器的用法,存的指针,指向下标{visited[*ite]=true;queue.push_back(*ite);}}}
}
//DFS实现
void Graph::DFSUtil(int v, bool visited[])
{visited[v]=true;cout<<v<<" ";list<int>::iterator ite;for(ite=adj[v].begin();ite!=adj[v].end();ite++){if(!visited[*ite])DFSUtil(*ite,visited);//递归}
}//BFS搜索实现
void Graph::BFS()
{//初始化访问标记数组bool *visited=new bool[V];for(int i=0;i<V;i++){visited[i]=false;}//对每个连通分量调用一次BFSUtilfor(int i=0;i<V;i++)if(!visited[i])BFSUtil(i,visited);
}
//DFS搜索实现
void Graph::DFS()
{//初始化访问标记数组bool *visited=new bool[V];for(int i=0;i<V;i++){visited[i]=false;}//对每个连通分量调用一次BFSUtilfor(int i=0;i<V;i++)if(!visited[i])DFSUtil(i,visited);
}/* 测试 */
int main()
{// 创建图Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);cout << "Following is BFS Traversal (starting from vertex 2) \n";g.BFS();cout << endl;return 0;
}
/*BFS* 1 . 空间复杂度
无论是邻接表还是邻接矩阵的存储方式,BFS算法都需要借助一个辅助队列Q,n个顶点都需要入队一次,在最坏的情况下,空间复杂度为O(|V|)。
2 . 时间复杂度
当采用邻接表存储时,每个顶点均需搜索一次,故时间复杂度为O(|V|),在搜索任一顶点的邻接点时,每条边至少访问一次,故时间复杂度为O(|E|),算法总的时间复杂度为O(|V|+|E|)。
当采用邻接矩阵存储时,查找每个顶点的邻接点所需的时间为O(|V|),故算法总的时间复杂度为O(|V|^2)。
*//*DFS* 1 . 空间复杂度
DFS算法是一个递归算法,需要借助一个递归工作栈,故它的空间复杂度为O(|V|)。
2 . 时间复杂度
当以邻接表存储时,时间复杂度为O(|V|+|E|)。
当以邻接矩阵存储时,时间复杂度为O(|V|^2)。
*/

DFS和BFS算法介绍相关推荐

  1. [算法] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂

    二叉树的DFS与BFS算法 (Java) 1.概念 ①DFS (深度优先搜索) 维基百科读一遍 定义看完, 看一遍gif ②BFS (广度优先搜索) 维基百科读一遍 gif看一遍 2. 算法实现 二叉 ...

  2. java迷宫队列实现_Creator 迷宫生成: DFS 与 BFS 算法实现

    前言: 我的迷宫代码的实现受到 [liuyubobobo] 的影响. liuyubobobo 迷宫的实现: GUI 部分使用 java Swing,编程语言是 Java. **我的迷宫代码实现: ** ...

  3. [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析

  4. 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)

    广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...

  5. LeetCode算法题7:DFS和BFS

    文章目录 前言 深度优先搜索算法伪代码: 广度优先搜索算法伪代码: 一.图像渲染 DFS: BFS: 上面BFS算法存在的问题: 修改 1: 修改 2: 二.岛屿的最大面积 DFS: BFS : 三. ...

  6. 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)

    文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...

  7. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

  8. 搜素算法(基础)--DFS/BFS算法(JAVA)

    DFS.BFS的定义及C语言算法实现请参照 连通图遍历策略之深度优先搜索(C语言) 连通图遍历策略之广度优先搜索(C语言) 为了便于理解这里的数据是一个无向图,要求输出遍历顺序 下面只给出用例和算法, ...

  9. dfs时间复杂度_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

最新文章

  1. 一个不错的命令行解析类
  2. 用FIO测试存储性能
  3. matlab zp2,matlab用于控制系统数字仿真
  4. Repo 命令参考资料
  5. Tensorflow相关面试题
  6. 使用jmap来生成堆转储快照
  7. System verilog随机系统函数$urandom_range使用方法
  8. mysql版本更新之后忘记登录密码_MySQL 密码遗忘和登陆报错问题
  9. php 到精通 书,PHP从入门到精通——读书笔记(第20章:Zend Framwork框架)
  10. kubenetes 1.4安装kube-UI
  11. apache开源项目--thrift
  12. 谈FTP服务器***技术及其展望 (下)
  13. U-net,及其和FCN的区别
  14. 软件测试工具Winrunner使用的技巧
  15. 调查问卷或量表用总分还是平均分好?
  16. 网络游戏植入广告的案例
  17. Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法
  18. MedianFlow代码 程序示例
  19. php doctrine,PHP-如何使用Doctrine DBAL?
  20. python基础分析_数据分析之Python基础

热门文章

  1. git clone github源码 下载速度很慢的解决方法
  2. Linux基础第六章 信号
  3. Oracle 12C 新特性之扩展数据类型(extended data type)
  4. 如何让select选项的那个请选择不被选中
  5. 又一款iPhone病毒来袭:针对中国用户
  6. 关于Cocos2d-x发布游戏的时候遇到的问题和解决
  7. PL/SQL Developer远程连接Oracle数据库
  8. zimbra邮件服务器部署
  9. 华为机试HJ54:表达式求值
  10. jwt如何防止token被窃取_如何使用 NodeJS 实现 JWT 原理