广度优先遍历&深度优先遍历
一、广度优先算法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 ...
- 例题3-3 回文词(Palindromes, UVa401)
输入一个字符串,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓 回文串,就是反转以后和原串相同,如abba和madam.所有镜像串,就是左右镜像之后和原串相同,如2S和3AIAE.注意, ...
- CSP-S2020AFO记
2020-10.11 考初赛辣. 选择题考了一堆时间复杂度,一个不会(卒) 我寻思这01背包哪里能用贪心? 啊,这,这,这手写快排竟如此简单,手写取Max,手写队列,两个字符串颠来倒去,竟活到爆! 震 ...
- apache自带的ab测试失败请求原因
只要出现 Failed requests 就会多出现一行要求失败的各原因的数据统计,分别有 Connect, Length, 与 Exception 三种,分别代表的意义为:Connect ...
- Groovy中如何向已有的类添加新方法
Groovy 中有多种途径实现向原有类添加方法,具体有如下几种: MOP(meta object protocol) -- 详见 ExpandoMetaClass 扩展方法 -- GDK采用的此方法 ...
- Helium文档13-WebUI自动化-helium快速切换到selenium状态并调用其方法
前言 前面说过helium是对Selenium 进行了封装,那么我们如何使用selenium的方法呢,通过下面的介绍,我们能够清楚在helium中能够使用selenium的任何方法 入参介绍 def ...
- C#中string类的几个方法(indexof、lastindexof、substring)(转)
String.IndexOf String.IndexOf 方法 (Char, Int32, Int32) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置 ...
- 【git冲突解决】: Please commit your changes or stash them before you merge.
刚刚使用 git pull 命令拉取代码时候,遇到了这样的问题: error: Your local changes to the following files would be overwritt ...
- 【总结】HTTP
一.HTTP 1.http HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超文本数 ...
- OpenCascade拓扑对象之:拓扑对象的层次结构
@font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...