广度优先遍历&深度优先遍历
一、广度优先算法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 < ...
随机推荐
- bootStrap小结3
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- charles详解
Charles抓包https:https://www.jianshu.com/p/ec0a38d9a8cf 浅谈charles抓取https原理:https://www.jianshu.com/p/4 ...
- go 结构体函数
package main import "fmt" type Dog struct { Name string } func (d *Dog) speak() string { r ...
- linux(centos8):安装java jdk 14 (java 14.0.2)
一,下载jdk14 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...
- Redis Hashes 数据类型简述
Redis Hashes 是我们日常使用中比较高频的 Redis 数据类型,内部使用 Redis 字典结构存储,底层基于哈希表结构实现. 下面从哈希表节点,哈下表结构,Redis 字典,Redis 字 ...
- 聊聊简单又灵活的权限设计(RBAC)
你:我看完能知道个啥?我:也就以下两点吧一. 了解基于 RBAC 思路的表设计二. 表数据在实际开发场景中是如何使用的你:我觉得那应该还有点干货吧我:我不要你觉得,我要我觉得 (͡ ͡° ͜ つ ͡͡ ...
- Spring 缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术:并支 ...
- 对于app监测root权限或者强制升级
只做分享学习 以下方法对于大多数Root检测的App (不限于仅银行类App),均适用. 另,"主用户 + Island用户" 情况下: 如果App仅安装在 Island下,当绕不 ...
- Mybatis---06Mybatis配置文件浅析(四)
参考链接:深入理解Mybatis插件开发 1.plugins:与其称为Mybatis插件,不如叫Mybatis拦截器,更加符合其功能定位,实际上它就是一个拦截器,应用代理模式,在方法级别上进行拦截. ...
- java数据结构-11循环双端队列
@SuppressWarnings("unchecked") public class CircleDeque<E> { private int front; priv ...