广度优先遍历&深度优先遍历
一、广度优先算法BFS(Breadth First Search)
基本实现思想
(1)顶点v入队列。
(2)当队列非空时则继续执行,否则算法结束。
(3)出队列取得队头顶点v;
(4)查找顶点v的所以子节点,并依次进入队列;
(5)转到步骤(2)。
二、深度优先算法DFS(Depth First Search)
基本思想:
递归实现:
(1)访问顶点v,打印节点;
(2)遍历v的子节点w,while(w存在),递归执行该节点;
代码:
/布尔型数组Visited[]初始化成false
void DFS(Vetex v)
{
Visited[v] = true;
for each w adjacent to v
if (!Visited[w])
DFS(w);
}
非递归实现:
(1)访问顶点v,顶点v入栈S,打印输出顶点,visited[v]=1
(2)while(栈S非空)
x=栈S的顶元素(不出栈);
if(存在并找到未被访问的x的子结点w)
访问w,打印输出,visited[w]=1;w进栈;
else
x出栈;
注:visited[x]=1,标记该节点已被访问
1 #include<iostream>
2 #include<queue>
3 #include<stack>
4 #include<vector>
5 using namespace std;
6 const int MAX = 10;
7 typedef struct graph
8 {
9 int n;//顶点个数
10 int e;//边数
11 int edge[MAX][MAX];//邻接矩阵
12 }Graph;
13 vector<bool> visited(MAX,0);
14 void InitGraph(Graph *G)
15 {
16 for (int i = 0; i < MAX; i++)
17 for (int j = 0; j < MAX; j++)
18 G->edge[i][j] = 0;
19 }
20
21 //广度优先遍历,num是从哪个结点开始
22 void BFS(Graph G,int num)
23 {
24 queue<int> q;
25 cout << num << " ";
26 visited[num] = true;
27 q.push(num);
28 while (!q.empty())
29 {
30 int temp = q.front();
31 q.pop();
32 for (int i = 0; i < G.n; i++)
33 {
34 if (G.edge[temp][i] != 0 && visited[i] == false)
35 {
36 q.push(i);
37 cout << i << " ";
38 visited[i] = true;
39 }
40 }
41 }
42 cout << endl;
43 }
44
45 //深度优先遍历的递归版本
46 void DFS1(graph G,int num)
47 {
48 visited[num] = true;
49 cout << num << " ";
50 for (int i = 0; i < G.n; i++)
51 {
52 if (G.edge[num][i] != 0 && visited[i] == false)
53 DFS1(G,i);
54 }
55 }
56
57 //深度优先非递归版本
58 void DFS2(graph G,int num)
59 {
60 stack<int> s;
61 s.push(num);
62 visited[num] = true;
63 while (!s.empty())
64 {
65 int temp = s.top();
66 s.pop();
67 cout << temp<<" ";
68 for (int i = G.n - 1; i >= 0; i--)
69 {
70 if (G.edge[temp][i] != 0 && visited[i] == false)
71 {
72 s.push(i);
73 visited[i] = true;
74 }
75 }
76 }
77 cout << endl;
78 }
79
80 int main()
81 {
82 int a, b, v, i;
83 Graph G;
84 cin >> G.n >> G.e; //n,e为顶点个数,边个数
85 InitGraph(&G); //对G进行初始化,整个MAX范围初始化
86 for (i = 0; i < G.e; i++) //建图
87 {
88 cin >> a >> b >> v; //a,b为顶点,v为权值
89 G.edge[a][b] = v;
90 G.edge[b][a] = v;
91 }
92 BFS(G, 0); //0为开始搜索的顶点序号
93 for (i = 0; i < MAX; i++)
94 visited[i] = 0;
95 DFS1(G, 0);
96 cout << endl;
97 for (i = 0; i < MAX; i++)
98 visited[i] = 0;
99 DFS2(G, 0);
100 return 0;
101 }
广度优先遍历&深度优先遍历的更多相关文章
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
- c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)
一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...
- 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈: 算法思想: 1. 栈初始化 2. 输出起始顶点,起始顶点改为“已访问”标志,将 ...
- python---二叉树广度优先和深度优先遍历的实现
class Node(object): """结点""" def __init__(self, data): self.data = dat ...
- js实现对树深度优先遍历与广度优先遍历
深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...
- 深度优先遍历&广度优先遍历
二叉树的前序遍历,中序遍历,后序遍历 树的遍历: 先根遍历--访问根结点,按照从左至右顺序先根遍历根结点的每一颗子树. 后根遍历--按照从左至右顺序后根遍历根结点的每一颗子树,访问根结点. 先根:AB ...
- [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联 ...
- C++ 二叉树深度优先遍历和广度优先遍历
二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...
随机推荐
- 基于SpringAop的鉴权功能
什么是 AOP 首先我们先了解一下什么是AOP,AOP(Aspect Orient Programming),直译过来就是面向切面编程.AOP是一种编程思想,是面向对象编程(OOP)的一种补充.面向对 ...
- 如何轻松使用 C 语言实现一个栈?
什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...
- rabbitmq与erlang版本
来源自https://www.rabbitmq.com/which-erlang.html erlang安装包下载地址 https://packages.erlang-solutions.com/er ...
- docker-docker-compose 安装
1.安装docker-compose(官网:https://github.com/docker/compose/releases) 安装: curl -L https://github.com/doc ...
- 基于gin的golang web开发:路由
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...
- 【多次实践】win10+ubuntu18.04lts双系统安装葵花宝典(安装篇)
这个教程诞生的缘由很简单,吃的太饱,硬是要折腾,结果,这一折腾便是20余小时,故写此文,帮助后来者少走弯路! 在本文开始,请先允许我对网上很多类似的教程嗤之以鼻,很成功地让我走了很多的弯路,一些有效简 ...
- SSM中 spring-mvc.xml 配置文件
<!--扫描控制器包--><context:component-scan base-package="<!--控制器包所在路径-->">< ...
- mysql 架构简介
mysql的逻辑架构 第一层:进行连接处理.权限认证.安全校验等. 当客户端(应用)连接到mysql服务器时,服务器会创建使用一个线程进行处理连接(少量的线程服务大量的连接),随后服务器需要对该连接进 ...
- .Net Core 3.1.2 区域路由配置【原创】
昨天遇到一个项目问题,新建的.NET core矿建在新建区域的MVC页面里面,无法通过路由找到页面.然后在网络上查询很多资料,发现都是千古文章一大抄,而且都是错误的. 后面又添加了3个专业技术群,同样 ...
- java数据结构-11循环双端队列
@SuppressWarnings("unchecked") public class CircleDeque<E> { private int front; priv ...