前言

这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下。

广度优先搜索

有一个有向图如图a

图a

广度优先搜索的策略是:

从起始点开始遍历其邻接的节点,由此向外不断扩散。

1.假设我们以顶点0为原点进行搜索,首先确定邻接0的顶点集合S0 = {1,2}。

2.然后确定顶点1的集合S1 = {3},顶点2没有邻接点,所以集合为空。

3.然后确定3的邻接点集合S3,因为2已经被遍历过,所以不考虑,所以由顶点3知道的邻接点集合S3 = {4}。

4.然后再确定顶点4的邻接点集合,顶点4没有更多的邻接点了,此时也没有还未遍历的邻接点集合,搜索终止。

遍历的路径可以参考如下图红色标记的路径:

动态过程

代码的实现思路:

  1. BFS()
    {
    输入起始点;
  2. 初始化所有顶点标记为未遍历;
  3. 初始化一个队列queue并将起始点放入队列;
  4.  
  5. whilequeue不为空)
  6. {
  7. 从队列中删除一个顶点s并标记为已遍历;
  8. s邻接的所有还没遍历的点加入队列;
  9. }
    }

深度优先遍历

继续以图a为例

图a

深度优先遍历的策略是:

从一个顶点v出发,首先将v标记为已遍历的顶点,然后选择一个邻接于v的尚未遍历的顶点u,如果u不存在,本次搜素终止。如果u存在,那么从u又开始一次DFS。如此循环直到不存在这样的顶点。

比如图a中

1.从顶点0开始,将0标记为已遍历,然后选择未被遍历的邻接0的顶点1。

2.标记顶点1,然后选择3并标记,然后选择顶点3邻接的顶点2。

3.顶点2标记后没有与它邻接的未标记的点,所以返回3选择另一个邻接3并且未被标记的顶点4。

4.顶点4没有更多的符合条件的点,因此搜索终止,返回到3,3没有更多的点,搜索终止返回到1,最后返回到0,搜索终止。

遍历的路径可以参考如下图红色标记的路径:

动态过程

代码的实现思路:

  1. DFS(顶点v
  2. {
  3. 标记v为已遍历;
  4. for(对于每一个邻接v且未标记遍历的点u
  5. DFSu);
  6. }

一个简单的应用

问题不赘述,具体可参考   LeetCode朋友圈问题  。

实现的代码如下(C#):

  1. public class Solution {
  2. public void dfs(int [,]M,int []visit,int i)
  3. {
  4. for(int j = ;j < M.GetLength();j++)
  5. {
  6. if(M[i,j] == && visit[j] == )
  7. {
  8. visit[j] = ;
  9. dfs(M,visit,j);
  10. }
  11. }
  12. }
  13.  
  14. public void bfs(int [,]M,int []visit,int i)
  15. {
  16. Queue<int> q = new Queue<int>();
  17. q.Enqueue(i);
  18. while(q.Count > )
  19. {
  20. int temp = q.Dequeue();
  21. for(int j = ;j < M.GetLength();j++)
  22. {
  23. if(M[temp,j] == && visit[j] == )
  24. {
  25. visit[j] = ;
  26. q.Enqueue(j);
  27. }
  28. }
  29. }
  30. }
  31.  
  32. public int FindCircleNum(int[,] M) {
  33. int N = M.GetLength();
  34. int circle = ; //朋友圈数
  35. int[] visit = new int[N];
  36. for(int i = ;i < N;i++)
  37. {
  38. if(visit[i] == ) //还没被遍历过
  39. {
  40. //dfs(M,visit,i); //使用dfs搜索并标记与其相关的学生
  41. bfs(M,visit,i); //使用bfs搜索并标记与其相关的学生
  42. circle++;
  43. }
  44. }
  45. return circle;
  46. }
  47. }

参考资料

《数据结构、算法与应用——C++描述》   作者:【美】 萨特吉·萨尼       机械工业出版社

Visualgo算法可视化网站

数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS的更多相关文章

  1. matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  2. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  3. (转)广度优先搜索BFS和深度优先搜索DFS

    1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...

  4. 广度优先遍历-BFS、深度优先遍历-DFS

    广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...

  5. 广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点

    深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他 ...

  6. 采用邻接矩阵表示图的深度优先搜索遍历(与深度优先搜索遍历连通图的递归算法仅仅是DFS的遍历方式变了)

    //采用邻接矩阵表示图的深度优先搜索遍历(与深度优先搜索遍历连通图的递归算法仅仅是DFS的遍历方式变了) #include <iostream> using namespace std; ...

  7. 广度优先(bfs)和深度优先搜索(dfs)的应用实例

    广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...

  8. 搜索与图论①-深度优先搜索(DFS)

    深度优先搜索(DFS) 例题一(指数型枚举) 把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. ...

  9. python数据结构与算法——图的广度优先和深度优先的算法

    根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打 ...

随机推荐

  1. 大型服装集团BI决策系统的分析主题模块

    一般BI商业智能解决方案都包含财务.销售.客户等分析模块,本文分享的是某大型服装集团通过帆软FineBI建设的BI决策系统.该决策系统主要针对财务.资金.采购.生产.库存.物流.销售.渠道.产品.客户 ...

  2. 【翻译】Siesta事件记录器入门

    原文:Getting started with the Siesta event recorder 作者:Mats Bryntse 随着事件记录器功能的发布越来越近,我们准备了一下入门指南,向大家展示 ...

  3. OpenCV 闭合轮廓检测

    这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了. // A closed contour.cpp : 定义控制台应用程序的入口点. // #include &q ...

  4. LeetCode之“动态规划”:Scramble String

    题目链接 题目要求: Given a string s1, we may represent it as a binary tree by partitioning it to two non-emp ...

  5. 第十八篇 ANDROID的声音管理系统及服务

     声音管理系统用来实现声音的输入和输出.声音的控制和路由等功能,包括主和各种音源的音量调节.声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理.音效的播放.音轨设置和播放.录音设置 ...

  6. XMPP系列(五)---文件传输

    xmpp中发送文件和接收文件的处理有些不太一样,接收文件处理比较简单,发送稍微复杂一些. 首先需要在XMPPFramework.h中添加文件传输类 //文件传输 //接收文件 #import &quo ...

  7. Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化

    Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大 ...

  8. 初探linux子系统集之led子系统(一)

    就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...

  9. 高仿qq健康

    概述 学习别人的代码,在此基础上 优化代码结构 增加动画 要点记录 通过mRatio参数,让宽高始终是一个比例 贝塞尔曲线手动画矩形圆角 画虚线 根据基准点绘制文字 属性动画的使用 画笔宽度的自适应 ...

  10. LeetCode之旅(22)-House Robber

    题目: You are a professional robber planning to rob houses along a street. Each house has a certain am ...