数据结构-6-深度广度遍历搜索原理详解

深度广度遍历搜索的定义想必大家都能熟练的掌握了,下面我就通过一个图的实例,把应用的代码直接贴上供大家参考,以后可以直接借鉴或者使用。

#include <iostream>

#include <string>

#include "Queue.h"

using namespace std;

//图的邻接矩阵存储表示

#define INFINITY INT_MAX

#define MAX_VERTEX_NUM 20

typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向图,有向网,无向图,无向网}

typedef enum {OK, ERROR} Status;

typedef struct ArcCell{

int adj;        //顶点关系类型。对于无权图,用0或1表示相邻否。对于有权图,则为权值类型。

string info;    //该弧所携带的信息

}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct {

int vexs[MAX_VERTEX_NUM];   //顶点向量

AdjMatrix arcs;             //邻接矩阵

int vexnum, arcnum;         //图的当前顶点数和弧数

GraphKind kind;             //图的种类标志

}MGraph;

bool visited[MAX_VERTEX_NUM];   //设访问标志数组,供遍历时使用

2. 构造测试用的建立无向图的函数

[cpp] view plaincopyprint?

void CreateUDGTest(MGraph &G)

{   //构造一个测试用的无向图

int i,j;

//数组a[9][2]包含所有边

//int a[9][2] = {0,1,0,2,0,3,1,4,1,5,4,5,7,8,8,9,9,7};

int a[9][2] = { {0,1}, {0,2}, {0,3}, {1,4}, {1,5}, {4,5}, {7,8}, {8,9}, {9,7}};

G.kind = UDG;

G.vexnum = 10;

G.arcnum = 9;

for(i=0; i<G.vexnum; ++i)        //构造顶点向量

G.vexs[i] = i;

for(i=0; i<G.vexnum; ++i)        //初始化为全0

for(j=0; j<G.vexnum; ++j)

G.arcs[i][j].adj = 0;

for(i=0; i<G.arcnum; ++i)        //对存在的边赋值1

G.arcs[a[i][0]][a[i][1]].adj = G.arcs[a[i][1]][a[i][0]].adj = 1;

}

3. 深度优先遍历和广度优先遍历函数

void DFSTraverse(MGraph G)

{   //对图G作深度优先遍历

int v;

for(v=0; v<G.vexnum; ++v)    //访问标志数组初始化

visited[v] = false;

for(v=0; v<G.vexnum; ++v)

if(!visited[v])         //对未访问的顶点调用DFS

DFS(G, v);

}

void DFS(MGraph G, int v)

{   //从第v个顶点出发,递归地深度优先遍历图G

int w;

visited[v] = true;

VisitFunc(v);               //访问第v个顶点

for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G, v, w))

if(!visited[w])

DFS(G, w);          //对v的尚未访问的邻接顶点w递归调用DFS

}

void BFSTraverse(MGraph G)

{

//按广度优先非递归地遍历图G。使用辅助队列Q和访问标志数组visited

int v, w, u;

LinkQueue Q;

for(v=0; v<G.vexnum; ++v)    //访问标志数组初始化

visited[v] = false;

InitQueue(Q);               //置空的辅助队列

for(v=0; v<G.vexnum; ++v)

if(!visited[v])

{

visited[v] = true;

VisitFunc(v);

EnQueue(Q,v);

while(QueueEmpty(Q) == FALSE){

DeQueue(Q, u);  //对头元素出队,并置为u

for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G, v, w))

if(!visited[w]){    //w为u未访问的邻接顶点

visited[w] = true;

VisitFunc(w);

EnQueue(Q, w);

}

}

}//if

}//BFSTraverse

void VisitFunc(int v)

{   //访问第v个节点

cout<<v<<endl;

}

int FirstAdjVex(MGraph G, int v)

{   //返回节点v的第一个邻接顶点

int i;

for(i=0; i<G.vexnum; ++i)

if(G.arcs[v][i].adj != 0 && i!=v)

return i;

return -1;          //如果没有,返回-1

}

int NextAdjVex(MGraph G, int v, int w)

{

//返回节点v的邻接顶点中w之后的下一个邻接顶点

int i;

for(i=w+1; i<G.vexnum; ++i)

if(G.arcs[v][i].adj != 0 && i!=v)

return i;

return -1;          //如果没有,返回-1

}

4. 主函数-测试用

int main()

{

MGraph gra;

CreateUDGTest(gra);             //构造无向图G

cout<<"对无向图G作深度优先遍历:"<<endl;

DFSTraverse(gra);               //对无向图G作深度优先遍历

cout<<"对无向图G作广度优先遍历:"<<endl;

BFSTraverse(gra);

return 0;

}

时间: 2025-01-06 02:24:48

数据结构-6-深度广度遍历搜索原理详解的相关文章

数据结构-4-Trie树:应用于统计、排序与搜索 原理详解

Trie树:应用于统计.排序和搜索 1. trie树定义 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非

深度学习原理详解及Python代码实现

深度学习框架如Tensorflow和Pytorch等为用户提供了可供调用的API,但也隐藏了深度学习底层的实现细节. 为方便大家更加深入地理解深度学习原理并了解其底层实现方法,特此推出了<课程深度学习原理详解及Python代码实现>.期望能"掀起你的盖头来,让我看看你的模样",为深度学习进一步的优化和创新打下根基. 课程链接:https://edu.51cto.com/course/21426.html 本课程详细讲解深度学习原理并进行Python代码实现.课程内容涵盖感知

Java网络编程和NIO详解6:Linux epoll实现原理详解

Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ Linux epoll实现原理详解 在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者pol

Influxdb原理详解

本文属于<InfluxDB系列教程>文章系列,该系列共包括以下 15 部分: InfluxDB学习之InfluxDB的安装和简介 InfluxDB学习之InfluxDB的基本概念 InfluxDB学习之InfluxDB的基本操作 InfluxDB学习之InfluxDB的HTTP API写入操作 InfluxDB学习之InfluxDB数据保留策略(Retention Policies) InfluxDB学习之InfluxDB连续查询(Continuous Queries) InfluxDB学习之

Zigbee组网原理详解

Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57   [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 关键词:RFDFFDZigBee 1.组网概述 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 2. 网络初始化预备 Zigbee网络的建立是由网络

Redis原理详解

Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type 代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:typ

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

kickstart安装系统原理详解

前言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有什么? 光盘安装系统===>一个服务器DVD内置光驱百千块,百台服务器都配光驱就浪费了,因为一台服务器也就开始装系统能用的上,以后用的机会屈指可数.用USB外置光驱,插来插去也醉了. U盘安装系统===>还是同样的问题,要一台一台服务器插U盘. 网络安装系统(ftp,http,nfs) ===>这个方法不错,只要服务器能联网就可以装系统了

SVM-支持向量机原理详解与实践之一

目录(?)[+] 前言 SVM机器学习与深度学习 人工智能领域 机器学习与深度学习 SVM简介 SVM原理分析 快速理解SVM原理 线性可分和线性不可分 函数间隔和几何间隔 超平面分析与几何间隔详解 二次最优化 SVM-支持向量机原理详解与实践 前言 去年由于工作项目的需要实际运用到了SVM和ANN算法,也就是支持向量机和人工神经网络算法,主要是实现项目中的实时采集图片(工业高速摄像头采集)的图像识别的这一部分功能,虽然几经波折,但是还好最终还算顺利完成了项目的任务,忙碌一年,趁着放假有时间好好