数据结构和算法总结(一):广度优先搜索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: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打 ...
随机推荐
- 【翻译】使用Sencha Touch创建基于Tizen应用程序
原文:Building a Tizen App With Sencha Touch 作者:Gautam Agrawal Gautam Agrawal is Sencha's Sr. Product M ...
- mysql大小写敏感(默认为1,不敏感)
在 MySQL 中,数据库和表其实就是数据目录下的目录和文件,因而,操作系统的敏感性决定数据库和表命名的大小写敏感.这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Un ...
- Linux常用命令(第二版) --压缩解压缩命令
压缩解压缩命令: ----------.gz---------- 1.压缩 gzip[GNU zip]: /bin/gzip 格式: gzip 选项 [文件] #压缩文件,压缩后扩展名为.gz,Lin ...
- thrift实现HDFS文件操作
thrift 文件如下 namespace java com.pera.file.transform struct File{ 1:string path , 2:string co ...
- java--银行业务调度系统
转载请申明出处:http://blog.csdn.net/xmxkf 1. 银行调度业务系统的题目来源与需求阐述 银行业务调度系统: 模拟实现银行业务调度系统逻辑,具体需求如下: 1.银行内有6个 ...
- Docker学习笔记【四】Docker 仓库
访问仓库,仓库是集中从存放镜像的地方.类似Maven. Docker Hub 目前由Docker官方维护的一个公共仓库,其中包括15000的镜像. 注册 在 https://hub.docker.co ...
- 【大前端攻城狮之路】JavaScript函数式编程
转眼之间已入五月,自己毕业也马上有三年了.大学计算机系的同学大多都在北京混迹,大家为了升职加薪,娶媳妇买房,熬夜加班跟上线,出差pk脑残客户.同学聚会时有不少兄弟已经体重飙升,开始关注13号地铁线上铺 ...
- Binary Tree Zigzag Level Order Traversal(z字形打印二叉树)
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- java 垃圾回收总结(1)
java 垃圾回收总结(1) 以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆. java与C,c++有很大的不同就是java语言开发者不 ...
- Java Selenium 定位元素 实现的一个注册功能
import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; impor ...