数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言
这几天复习图论算法,觉得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没有更多的邻接点了,此时也没有还未遍历的邻接点集合,搜索终止。
遍历的路径可以参考如下图红色标记的路径:
动态过程
代码的实现思路:
- BFS()
{
输入起始点;- 初始化所有顶点标记为未遍历;
- 初始化一个队列queue并将起始点放入队列;
- while(queue不为空)
- {
- 从队列中删除一个顶点s并标记为已遍历;
- 将s邻接的所有还没遍历的点加入队列;
- }
}
深度优先遍历
继续以图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,搜索终止。
遍历的路径可以参考如下图红色标记的路径:
动态过程
代码的实现思路:
- DFS(顶点v)
- {
- 标记v为已遍历;
- for(对于每一个邻接v且未标记遍历的点u)
- DFS(u);
- }
一个简单的应用
问题不赘述,具体可参考 LeetCode朋友圈问题 。
实现的代码如下(C#):
- public class Solution {
- public void dfs(int [,]M,int []visit,int i)
- {
- for(int j = ;j < M.GetLength();j++)
- {
- if(M[i,j] == && visit[j] == )
- {
- visit[j] = ;
- dfs(M,visit,j);
- }
- }
- }
- public void bfs(int [,]M,int []visit,int i)
- {
- Queue<int> q = new Queue<int>();
- q.Enqueue(i);
- while(q.Count > )
- {
- int temp = q.Dequeue();
- for(int j = ;j < M.GetLength();j++)
- {
- if(M[temp,j] == && visit[j] == )
- {
- visit[j] = ;
- q.Enqueue(j);
- }
- }
- }
- }
- public int FindCircleNum(int[,] M) {
- int N = M.GetLength();
- int circle = ; //朋友圈数
- int[] visit = new int[N];
- for(int i = ;i < N;i++)
- {
- if(visit[i] == ) //还没被遍历过
- {
- //dfs(M,visit,i); //使用dfs搜索并标记与其相关的学生
- bfs(M,visit,i); //使用bfs搜索并标记与其相关的学生
- circle++;
- }
- }
- return circle;
- }
- }
参考资料
《数据结构、算法与应用——C++描述》 作者:【美】 萨特吉·萨尼 机械工业出版社
数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS的更多相关文章
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- (转)广度优先搜索BFS和深度优先搜索DFS
1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...
- 广度优先遍历-BFS、深度优先遍历-DFS
广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...
- 广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点
深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他 ...
- 采用邻接矩阵表示图的深度优先搜索遍历(与深度优先搜索遍历连通图的递归算法仅仅是DFS的遍历方式变了)
//采用邻接矩阵表示图的深度优先搜索遍历(与深度优先搜索遍历连通图的递归算法仅仅是DFS的遍历方式变了) #include <iostream> using namespace std; ...
- 广度优先(bfs)和深度优先搜索(dfs)的应用实例
广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...
- 搜索与图论①-深度优先搜索(DFS)
深度优先搜索(DFS) 例题一(指数型枚举) 把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. ...
- python数据结构与算法——图的广度优先和深度优先的算法
根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打 ...
随机推荐
- 大型服装集团BI决策系统的分析主题模块
一般BI商业智能解决方案都包含财务.销售.客户等分析模块,本文分享的是某大型服装集团通过帆软FineBI建设的BI决策系统.该决策系统主要针对财务.资金.采购.生产.库存.物流.销售.渠道.产品.客户 ...
- 【翻译】Siesta事件记录器入门
原文:Getting started with the Siesta event recorder 作者:Mats Bryntse 随着事件记录器功能的发布越来越近,我们准备了一下入门指南,向大家展示 ...
- OpenCV 闭合轮廓检测
这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了. // A closed contour.cpp : 定义控制台应用程序的入口点. // #include &q ...
- LeetCode之“动态规划”:Scramble String
题目链接 题目要求: Given a string s1, we may represent it as a binary tree by partitioning it to two non-emp ...
- 第十八篇 ANDROID的声音管理系统及服务
声音管理系统用来实现声音的输入和输出.声音的控制和路由等功能,包括主和各种音源的音量调节.声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理.音效的播放.音轨设置和播放.录音设置 ...
- XMPP系列(五)---文件传输
xmpp中发送文件和接收文件的处理有些不太一样,接收文件处理比较简单,发送稍微复杂一些. 首先需要在XMPPFramework.h中添加文件传输类 //文件传输 //接收文件 #import &quo ...
- Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化
Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大 ...
- 初探linux子系统集之led子系统(一)
就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...
- 高仿qq健康
概述 学习别人的代码,在此基础上 优化代码结构 增加动画 要点记录 通过mRatio参数,让宽高始终是一个比例 贝塞尔曲线手动画矩形圆角 画虚线 根据基准点绘制文字 属性动画的使用 画笔宽度的自适应 ...
- LeetCode之旅(22)-House Robber
题目: You are a professional robber planning to rob houses along a street. Each house has a certain am ...