深度优先搜索算法(DFS)

深度优先搜索算法思路:(有点贪心算法的意思)
1,从某个给定结点a出发,访问它
2,查找关于a的邻接点,查找到a的第一个邻接点b之后,对b结点进行DFS搜索,也就是对b结点执行步骤2…当某个结点的所有邻接点都被访问过之后,回退上一层DFS算法中继续运行
3,程序执行完毕

下面给出了在邻接矩阵存储无向图情况下的深度优先算法,两点间存在相连的边时在邻接矩阵中标记为1,否则全标记为0(包括自身到自身相连的情况)。每个被访问过的结点用visited数组标记:

void DFSTraverse(mGraph& G)
{int v;for (v = 0; v < G.vexnum; v++)visited[v] = false;//初始化visited为空for (v = 0; v < G.vexnum; v++)//保证访问所有结点if (visited[v] == false)DFS(G, v);
}
void DFS(mGraph& G, int v)
{std::cout << G.vex[v] << ' ';visited[v] = true;int w;for (w = 0; w < G.vexnum; w++)if (G.arc[v][w]!=0)if (visited[w] == false)DFS(G, w);
}

邻接表下的DFS函数:

void DFS(aGraph& G, int v)
{std::cout << G.vertices[v].data << ' ';visited[v] = true;arcNode* w;for (w = G.vertices[v].firstArc; w != NULL; w = w->nextArc)if (visited[w->adjvex] == false)DFS(G, w->adjvex);
}

广度优先搜索算法(BFS)

广度优先搜索算法采用了辅助数据结构队列。
广度优先搜索算法思路:
1,从某个给定结点a开始,将其入队
2,a出队并进行访问,且将a的所有邻接点依次入队,每出队(并访问)一个结点,就将它的其余未被访问过的邻接点入队,直到将所有结点访问,程序执行完毕

下面给出了在邻接矩阵存储情况下的广度优先算法,每个被访问过的结点用visited数组标记:

void BFSTraverse(mGraph& G)
{int v, w, u;for (v = 0; v < G.vexnum; ++v)visited[v] = false;int front = 0, rear = 0;int* queue = new int[G.vexnum];//构造循环队列for (v = 0; v < G.vexnum; ++v)//遍历完图中所有结点{if (visited[v]==false){rear = (rear + 1) % G.vexnum;queue[rear] = v;visited[v] = true;//入队做标记while (rear!=front)//队列不为空时{front = (front + 1) % G.vexnum;u = queue[front];std::cout << G.vex[u] << ' ';//出队并访问for (w = 0; w<G.vexnum; w++)if (G.arc[u][w] != 0)if (visited[w] == false){rear = (rear + 1) % G.vexnum;queue[rear] = w;visited[w] = true;}}}}
}

邻接表下的BFS算法类似于DFS,故省略掉。

完整示例


对上图进行深度优先搜索和广度优先搜索,代码如下:

#include<iostream>
#define maxSize 8//顶点数目
#define MAX 7//边的个数
//邻接矩阵
typedef struct
{int vexnum, arcnum;//顶点数和边数char vex[maxSize];//顶点信息(字符)int arc[maxSize][maxSize];//二维数组(存储边上的信息)
}mGraph;//邻接表
typedef struct arcNode
{int adjvex;//与该边所连顶点的序号double weight;//边上的权值struct arcNode* nextArc;
}arcNode;//边表结点
typedef struct
{char data;//顶点中存储的数据arcNode* firstArc;
}adjList;//顶点
typedef struct{int vexnum, arcnum;adjList vertices[maxSize];
}aGraph;bool visited[maxSize];//标记是否被访问
void DFSTraverse(mGraph& G);//DFS搜索算法
void DFS(mGraph& G, int v);
void BFSTraverse(mGraph& G);//BFS搜索算法
int main()
{using namespace std;mGraph G;//邻接矩阵存储图并进行初始化G.vexnum = maxSize;G.arcnum = MAX;char vexData[maxSize] = { 'a', 'b', 'c', 'd', 'e','f','g','h' };//顶点信息int arcData[MAX][2] = { { 0, 3 }, { 1, 3 }, { 2, 4 }, { 3, 4},{ 3, 5 }, { 4, 6 }, { 4, 7 } };//连接的边int i, j;for (i = 0; i < G.vexnum; ++i){G.vex[i] = vexData[i];for (j = 0; j < G.vexnum; j++)G.arc[i][j] = 0;}for (i = 0; i < G.arcnum; i++)G.arc[arcData[i][0]][arcData[i][1]] = G.arc[arcData[i][1]][arcData[i][0]] = 1;//初始化完毕cout << "深度优先搜索: ";DFSTraverse(G);cout << endl;cout << "广度优先搜索: ";BFSTraverse(G);cout << endl;return 0;
}void DFSTraverse(mGraph& G)
{int v;for (v = 0; v < G.vexnum; v++)visited[v] = false;//初始化visited为空for (v = 0; v < G.vexnum; v++)if (visited[v] == false)DFS(G, v);
}
void DFS(mGraph& G, int v)
{std::cout << G.vex[v] << ' ';visited[v] = true;int w;for (w = 0; w < G.vexnum; w++)if (G.arc[v][w]!=0)if (visited[w] == false)DFS(G, w);
}
void BFSTraverse(mGraph& G)
{int v, w, u;for (v = 0; v < G.vexnum; ++v)visited[v] = false;int front = 0, rear = 0;int* queue = new int[G.vexnum];//构造循环队列for (v = 0; v < G.vexnum; ++v){if (visited[v]==false){rear = (rear + 1) % G.vexnum;queue[rear] = v;visited[v] = true;//入队做标记while (rear!=front){front = (front + 1) % G.vexnum;u = queue[front];std::cout << G.vex[u] << ' ';//出队并访问for (w = 0; w<G.vexnum; w++)if (G.arc[u][w] != 0)if (visited[w] == false){rear = (rear + 1) % G.vexnum;queue[rear] = w;visited[w] = true;}}}}
}

输出结果为:

DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)相关推荐

  1. boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序

    boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 C++实现代 ...

  2. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  3. BFS(广度优先搜索算法)

    一.BFS的介绍 BFS(广度优先搜索,也可称宽度优先搜索)是连通图的一种遍历策略.因为它的基本思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域. 广度优先搜索(BFS)类似于二叉树的层序遍 ...

  4. BFS广度优先搜索算法//宽度优先搜索算法

    BFS宽度优先搜索算法,又称广度优先搜索,是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想. ...

  5. 广度优先搜索算法和深度优先搜索算法——关于路径搜索的问题解决

    广度优先搜索算法和深度优先搜索算法 目录 广度优先搜索算法和深度优先搜索算法 深度优先搜索算法 3.升级:用栈模拟深度优先,因为栈具有==先进先出==性质 广度优先算法 理解 升级:用队列实现广度搜索 ...

  6. 深度优先搜索算法(Depth-First-Search,DFS)与广度优先搜索算法(Breadth-First Search,BFS)理解

    最近学习到了这两种经典的算法,谈一下自己的理解 深度优先搜索算法(Depth-First-Search,DFS) 这个算法会尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现节点v ...

  7. 图的深度(DFS)/广度优先搜索算法(BFS)/Dijkstra

    类比二叉树先序遍历与图深度优先搜索 在引入图的深度优先搜索之前,为了更加容易理解.先考究一种特殊的图---二叉树的深度优先搜索算法---即二叉树的递归遍历方法. 二叉树的前序遍历算法: void Tr ...

  8. 算法导论:dfs深度优先搜索算法及基于dfs的拓扑排序以及宽度优先搜索算法bfs

    1.dfs深度优先搜索算法 算法导论中是通过三种标记颜色来介绍dfs的,white代表还没被搜过,grey代表被搜了一些,还没结束,white表示已经搜索完成的状态. c/c++复现dfs代码 #in ...

  9. Python实现 宽度/广度优先搜索算法, 深度优先搜索算法

    Python实现 宽度/广度优先搜索算法, 深度优先搜索算法 1. 二叉树图 2. 宽度/广度优先搜索算法(Breadth First Search,BSF) 3. 深度优先搜索算法 4. 宽度/广度 ...

最新文章

  1. 安装bigsur卡在12分钟_Big Sur为什么安装不了?macOS Big Sur无法完成安装的解决办法!...
  2. ARMV7,ARMV8
  3. ROS 机器人操作系统进阶实战
  4. 五步学会XMLHttpRequest
  5. HTML5的设计目的是为了在移动设备上支持多媒体
  6. 数据库复习总结(4)-数据库的分离、附加、脚本的创建
  7. html5-5 HTML5表单元素和内嵌框架
  8. 一、SCVMM2008R2安装部署
  9. matlab gui怎样将结果保存_Matlab将工作区变量保存到文件中的方法
  10. sitck-breaking折棍法理解
  11. html5shiv.js 的作用
  12. Android网络优化--概括
  13. 移动硬盘需要格式化才能打开如何解决?
  14. java压缩图片大小_java压缩图片、等比例压缩图片
  15. m3u8.sqlite文件转视频工具(开源免费)
  16. kube-scheduler源码分析(四)之 findNodesThatFit
  17. 微交易平台官网_熟悉官网常用版块
  18. 酷讯网半年内两换CEO 风投要业绩被指心太急
  19. [UOJ#207]共价大爷游长沙
  20. 路由守卫(全局守卫,局部守卫,组件内守卫)

热门文章

  1. 【Java架构:持续交付】一篇文章搞掂:持续交付理论
  2. Tuple解决在视图中通过razor获取控制器传递给视图的匿名对象的报错问题
  3. android studio gradle 配置
  4. oracle11g exp导出问题:部分表导不出来
  5. 通过Maven去运行单元测试
  6. C异常处理实现: setjmp和longjmp
  7. Java中的移位操作以及基本数据类型转换成字节数组【收集】
  8. HBase在淘宝的应用和优化小结
  9. java面试精典问答
  10. van 自定义组件_vant 自定义 van-dropdown-item的用法