深度优先搜索(Depth First Search)、广度优先搜索(Breadth First Search)
DFS:
/* 邻接表存储的图 - DFS */void Visit( Vertex V )
{printf("正在访问顶点%d\n", V);
}/* Visited[]为全局变量,已经初始化为false */
void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) )
{ /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */PtrToAdjVNode W;Visit( V ); /* 访问第V个顶点 */Visited[V] = true; /* 标记V已访问 */for( W=Graph->G[V].FirstEdge; W; W=W->Next ) /* 对V的每个邻接点W->AdjV */if ( !Visited[W->AdjV] ) /* 若W->AdjV未被访问 */DFS( Graph, W->AdjV, Visit ); /* 则递归访问之 */
}
BFS:
/* 邻接矩阵存储的图 - BFS *//* IsEdge(Graph, V, W)检查<V, W>是否图Graph中的一条边,即W是否V的邻接点。 */
/* 此函数根据图的不同类型要做不同的实现,关键取决于对不存在的边的表示方法。*/
/* 例如对有权图, 如果不存在的边被初始化为INFINITY, 则函数实现如下: */
bool IsEdge( MGraph Graph, Vertex V, Vertex W )
{return Graph->G[V][W]<INFINITY ? true : false;
}/* Visited[]为全局变量,已经初始化为false */
void BFS ( MGraph Graph, Vertex S, void (*Visit)(Vertex) )
{ /* 以S为出发点对邻接矩阵存储的图Graph进行BFS搜索 */Queue Q; Vertex V, W;Q = CreateQueue( MaxSize ); /* 创建空队列, MaxSize为外部定义的常数 *//* 访问顶点S:此处可根据具体访问需要改写 */Visit( S );Visited[S] = true; /* 标记S已访问 */AddQ(Q, S); /* S入队列 */while ( !IsEmpty(Q) ) {V = DeleteQ(Q); /* 弹出V */for( W=0; W<Graph->Nv; W++ ) /* 对图中的每个顶点W *//* 若W是V的邻接点并且未访问过 */if ( !Visited[W] && IsEdge(Graph, V, W) ) {/* 访问顶点W */Visit( W );Visited[W] = true; /* 标记W已访问 */AddQ(Q, W); /* W入队列 */}} /* while结束*/
}
用N表示图中顶点数,用E表示边数
如果用邻接表存储图,时间复杂度为O(N+E)
如果用邻接矩阵存储图,时间复杂度为O(N^2)
深度优先搜索(Depth First Search)、广度优先搜索(Breadth First Search)相关推荐
- C++Breadth First Search 广度优先搜索(附完整源码)
C++Breadth First Search 广度优先搜索的实现 C++Breadth First Search 广度优先搜索实现完整源码(定义,实现,main函数测试) C++Breadth Fi ...
- Breadth-first Search(广度优先搜索)专题1
广度优先搜索的定义 广度优先搜索BFS类似于树的层次遍历算法.基本思想是:首先访问顶点v,然后由v出发,依次访问v的各个未被访问过的顶点w1,w2,w3-wn.然后再访问wi(wi是w1,w2,w3- ...
- 广度优先搜索_快速入门广度优先搜索
通过学习图的搜索算法,我们来学习下两种常见的算法:BFS.DFS. 广度优先搜索(BFS) 广度优先搜索(Breadth-First-Search),它更像是一种地毯式.层层推进的搜索策略.先从距离起 ...
- Breadth-first Search(广度优先搜索)专题2
743. Network Delay Time 输入:int[][] times times[i]= new int[]{v,u,w} 表示从节点v到节点u需要时间w.注意这里是有向图. int N ...
- 【python3数据结构】图Graph及DFS(深度优先搜索)BFS(广度优先搜索)
Graph 和 Vertex 构建基于邻接列表: # -*- coding: utf-8 -*- # @Date : 2019/12/1 # @File : AdjListGraph.pyimport ...
- 八数码深度优先搜索_深度优先搜索和广度优先搜索
深度优先搜索和广度优先搜索 关于搜索&遍历 对于搜索来说,我们绝大多数情况下处理的都是叫 "所谓的暴力搜索" ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所 ...
- 数据结构与算法(python):广度优先搜索(Breadth First Search,BFS)和深度优先算法(Depth First Search,DFS)
参考自 MOOC数据结构与算法Python版 目录 一.广度优先搜索 1.1 BFS算法过程 1.2 广度优先搜索算法分析 二.深度优先搜索 2.1 骑士周游 2.1.1 问题定义 2.1.2 构建骑 ...
- 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- 广度优先搜索与深度优先搜索
广度优先搜索(宽度优先搜索,BFS)和深度优先搜索(DFS)算法的应用非常广泛,本篇文章主要介绍BFS与DFS的原理.实现和应用. 深度优先搜索 图的深度优先搜索(Depth First Search ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方.这里拿一起讨论,方便比较. 先给大家说一下两者大概的区别: 如果搜索是以接近起始状态的程序依次扩展状态的, ...
最新文章
- Nature 首度揭示大脑传递信息的真正逻辑
- Ceryx —— 基于 OpenResty 的动态反向代理
- dispatchTouchEvent onInterceptTouchEvent onTouchEvent
- linux 进程 地址空间 内存分布 简介
- 人脸识别安全吗?调查称六成受访者认为技术有被滥用趋势
- 有关Java中json字符串与map的转换使用
- js 获取元素,同级元素下的子元素总结
- 为基于类的策略选择突发数据量和超额突发数据量
- 【史上最详细】动态规划:矩阵连乘问题(C++实现,含备忘录方法)
- “Hello,Github!——如何配置并上传一个已有项目到Git上
- ROS(kinetic)安装中的一些问题(已解决)
- Vivado 约束文件XDC使用经验总结
- 《spring-boot学习》-10-RabbitMQ
- odoo tree 排序
- 主成分分析 PCA算法原理
- pe擦除服务器硬盘,怎么彻底删除硬盘数据
- 进制的转换(计算方法)
- linux文件名补全,Linux中10个关于命令行自动补全的技巧
- 机器学习,分类算法(饭店评价的例子)
- 二叉树:给后序中序遍历,求前序
热门文章
- c++ switch语句
- Elasticsearch分词器介绍
- 一个10年C++程序员对技术和业务的感悟,献给还在迷茫中的你
- 判断文件或目录是否存在的几种方式
- D. 互联网架构模板
- [C语言]口令比较填空:阅读程序,按要求在空白处填写适当的表达式或语句,使程序完整并符合题目要求。 下面程序比较用户键盘输入的口令userInput与内设的口令password是否相同。若相同,
- 快播转型,用户且用切珍惜
- 程序员如何渡过中年危机
- 青少年等级考试【Python通关干货】(二级)
- 什么?RecyclerView中获取点击位置的接口被废弃了?