广度优先遍历&深度优先遍历
一、广度优先算法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 < ...
随机推荐
- tomcat加载失败
tomcat启动加载信息如下: Connected to server [2017-10-16 09:02:28,149] Artifact basic-admin:war exploded: Art ...
- 在shell中截取心仪的字符串
file=/dir1/dir2/dir3/my.file.txt ${file#*/} 去掉左边 ${file##*/} 去掉左边最后一个 ${file%/*} 去掉右边 ${file%%/*} 去掉 ...
- pytest文档45-allure添加环境配置(environment)
前言 在 allure 报告首页 ENVIRONMENT 显示 'There are no environment variables' 没有环境变量的配置信息. 环境变量配置可以添加报告相关的配置参 ...
- 使用composer 显示错误美化
新建comoser.json { "name": "brady_frmwork", "description":"php fram ...
- spring boot:用shardingjdbc实现多数据源的分库分表(shardingsphere 4.1.1/spring boot 2.3.1)
一,shardingjdbc的用途 1,官方站介绍: Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈, 它由 JDBC.Proxy 和 Sidecar( ...
- linux wget指定下载目录和重命名
当我们在使用wget命令下载文件时,通常会需要将文件下载到指定的目录,这时就可以使用 -P 参数来指定目录,如果指定的目录不存在,则会自动创建. 示例: p.p1 { margin: 0; font: ...
- 生成流水号(20060210-0001)的SQL函数
create table t_sql(id int identity(1,1),code char(13),[name] nvarchar(10)) go create function f_crea ...
- BCE和CE交叉熵损失函数的区别
首先需要说明的是PyTorch里面的BCELoss和CrossEntropyLoss都是交叉熵,数学本质上是没有区别的,区别在于应用中的细节. BCE适用于0/1二分类,计算公式就是 " - ...
- ceil中有-0啊
这里主要是有一点: 1 Math.ceil(d1) ceil 方法上有这么一段注释:If the argument value is less than zero but greater ...
- 数位dp(贴一个模板=。=)
emmmm,之前看到大佬的博客感觉这个模板挺有用的,就贴了一个= = 然后解释什么的都有了就...... 数位dp一般应用于: 求出在给定区间[A,B]内,符合条件P(i)的数i的个数. 条件P(i) ...