数据结构和算法总结(一):广度优先搜索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: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打 ...
随机推荐
- Leetcode_94_Binary Tree Inorder Traversal
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42876657 Given a binary tree, r ...
- 一个简单的多机器人编队算法实现--PID
用PID进行领航跟随法机器人编队控制 课题2:多机器人编队控制研究对象:两轮差动的移动机器人或车式移动机器人研究内容:平坦地形,编队的保持和避障,以及避障和队形切换算法等:起伏地形,还要考虑地形情况对 ...
- UML之状态图
状态图,英文名曰-Statechart Diagram,她是系统的动态方面建模的五种图之一,一个状态图显示了一个状态机,在为对象的生命期建模中,她发挥着重要的作用,展示了单个对象内从状态到状态的控制流 ...
- centos 下安装mysql-5.6.11
这次是在centos6.4下安装mysql,在安装之前,你要先确定你的linux已经安装了这些包: wget, gcc-c++, ncurses-devel ,cmake, make ,perl 如果 ...
- Java-ServletConfig
/** * * A servlet configuration object used by a servlet container * to pass information to a servle ...
- Linux - Shell变量的配置守则
变量的配置守则 变量与变量内容以一个等号『=』来连结,如下所示: 『myname=VBird』 等号两边不能直接接空格符,如下所示为错误: 『myname = VBird』或『myname=VBird ...
- LeetCode(24)-Balanced Binary Tree
题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...
- nasm预处理器(3)
nasm提供一个限定符.nolist,可以包含它到一个宏定义中,这样该宏就不会在列表文件中被展开:限定符 .nolist直接放到参数后面: %macro foo 1.nolist 条件汇编 和C预处理 ...
- win32多线程学习笔记
<多核程序设计技术> 第五章--线程api,一个使用windows事件的线程应用程序,vs2008下编译调试通过. // 线程通信机制.cpp : 定义控制台应用程序的入口点. // #i ...
- ORM框架--GreenDao 3.0基本使用指南
0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...