一、广度优先算法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 }

广度优先遍历&深度优先遍历的更多相关文章

  1. 【图数据结构的遍历】java实现广度优先和深度优先遍历

    [图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...

  2. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  3. 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)

    前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈: 算法思想:        1. 栈初始化        2. 输出起始顶点,起始顶点改为“已访问”标志,将 ...

  4. python---二叉树广度优先和深度优先遍历的实现

    class Node(object): """结点""" def __init__(self, data): self.data = dat ...

  5. js实现对树深度优先遍历与广度优先遍历

    深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...

  6. 深度优先遍历&广度优先遍历

    二叉树的前序遍历,中序遍历,后序遍历 树的遍历: 先根遍历--访问根结点,按照从左至右顺序先根遍历根结点的每一颗子树. 后根遍历--按照从左至右顺序后根遍历根结点的每一颗子树,访问根结点. 先根:AB ...

  7. [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现

    1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联 ...

  8. C++ 二叉树深度优先遍历和广度优先遍历

    二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...

  9. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

随机推荐

  1. 发布MeteoInfo 1.2.8

    增加了对SYNOP数据的支持(功能从C#版移植过来).数据可以从这里下载:http://weather.cod.edu/digatmos/syn/SYNOP数据搞气象的人应该多少知道些,类似MICAP ...

  2. python 产生随机函数random

    random是内建(built-in)函数,作用是产生随机数 导入模块: 接着就可以调用random模块下的函数了使用 dir(random)可以查看random模块下有哪些函数,结果如下: 最常用的 ...

  3. 【自学编程】C语言编程简单的小程序,计算长方体体积!

    计算长方体体积 有朋友会说长方体体积还不好算吗?长X宽X高.没错用计算器一下就可以出结果,编程反而麻烦些,但是我们说的是这种思维,如果复杂的重复运算的话写好程序就非常简单了. 简单运算下一个固定高度的 ...

  4. 扫描仪扫描文件处理-图像扫描加工到生成PDF步骤简述[JAVA版]

    另参见:https://www.cnblogs.com/whycnblogs/p/8034276.html 详细见:https://github.com/barrer/scan-helper 用途: ...

  5. 【计算几何 05】Pick定理

    什么是Pick定理(皮克定理) 来自wiki的介绍: 给定顶点座标均是整点(或正方形格子点)的简单多边形,皮克定理说明了其面积 \(A\)和内部格点数目 \(i\) .边上格点数目 \(b\) 的关系 ...

  6. MVC实现修改数据

    前言 前言 最近没什么好写的,所以写个修改来巩固一下知识 控制器 public ActionResult UpdeteCartsNum(SYS_Carts sYS_Carts) { var list ...

  7. 构造函数原理 - Js对象

    构造函数内部原理 有new之后,函数变成构造函数,产生三步隐式变化 1.函数执行,在函数体顶端隐式加上var this = {}; 2.执行赋值,AO{ this : {name:'zhangsan' ...

  8. find for /f 分割字符串 bat

    @Echo off::总用例数For /f "tokens=2" %%i in ('Type bat.txt^|Find "Ran"') do (Echo %% ...

  9. 手写Javaweb服务器

    简单web服务器 回忆socket 创建客服端(在httpClient_1包下) public class Client {    public static void main(String[] a ...

  10. 第三章 MySQL的多实例

    一.MySQL服务构成 1.MySQL程序结构 1.连接层 2.sql层 3.存储引擎层 2.MySQL逻辑结构 1.库 2.表:元数据+真实数据行 3.元数据:列+其它属性(行数+占用空间大小+权限 ...