详细介绍广度优先搜索的实现,原理,c++程序

如题所述

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。

已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的宽度优先树。对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。
  之所以称之为宽度优先算法,是因为算法自始至终一直通过已找到和未找到顶点之间的边界向外扩展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点。
  为了保持搜索的轨迹,宽度优先搜索为每个顶点着色:白色、灰色或黑色。算法开始前所有顶点都是白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。在搜索中第一次碰到一顶点时,我们说该顶点被发现,此时该顶点变为非白色顶点。因此,灰色和黑色顶点都已被发现,但是,宽度优先搜索算法对它们加以区分以保证搜索以宽度优先的方式执行。若(u,v)∈E且顶点u为黑色,那么顶点v要么是灰色,要么是黑色,就是说,所有和黑色顶点邻接的顶点都已被发现。灰色顶点可以与一些白色顶点相邻接,它们代表着已找到和未找到顶点之间的边界。
  在宽度优先搜索过程中建立了一棵宽度优先树,起始时只包含根节点,即源顶点s.在扫描已发现顶点u的邻接表的过程中每发现一个白色顶点v,该顶点v及边(u,v)就被添加到树中。在宽度优先树中,我们称结点u 是结点v的先辈或父母结点。因为一个结点至多只能被发现一次,因此它最多只能有--个父母结点。相对根结点来说祖先和后裔关系的定义和通常一样:如果u处于树中从根s到结点v的路径中,那么u称为v的祖先,v是u的后裔。

参考资料:http://baike.baidu.com/view/825760.htm

温馨提示:内容为网友见解,仅供参考
无其他回答

详细介绍广度优先搜索的实现,原理,c++程序
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考...

C++ 基本算法 - 广度优先搜索
代码实现的基本步骤如下:1. 定义队列 g,放入起点 s。2. 使用 while 循环,条件为队列非空。3. 取出队首节点,访问并出队。4. 将未访问的相邻节点入队,标记层号递增。5. 重复步骤 2-4 直到找到出口或队列为空。在处理矩阵中的"块"个数或迷宫中的最少步数问题时,BFS 都是核心策略,通过枚...

BFS深度理解与代码实现(C++)
BFS,即广度优先搜索,字面意思为广度撒网,不会针对性。它通过队列(queue,先进先出)实现,与DFS(深度优先搜索)相比,DFS使用栈(Stack,先进后出)实现,向着某个方向一干到底。通过树状结构可以更方便理解,如下所示:在大多数场景下,我们使用DFS的情况远多于BFS。如果使用DFS\/BFS仅为了遍历一棵树...

【算法篇】广\/宽度优先搜索及相关问题详解
实现搜索过程,使用队列que存储待访问的节点,将起点入队。循环取出队首元素,若到达终点则终止搜索。将队首元素上下左右四个相邻格子依次入队,并更新步数。重复此过程直至找到终点或队列为空。广度优先搜索模板用于解决最短路径问题,它从初始状态出发,逐层扩展,直至找到目标状态。此方法适用于迷宫、地图导...

求广度优先算法C++走迷宫程序,可以显示路径
一般在程序中需要用到先进先出的队列数据结构 下面是程序的代码,主要原理是用到 quei,quej和prep三个数组来构成队列 分别储存路径的行,列坐标和上一个节点在队列中的位置 大致算法如下,右三个嵌套的循环实现 首先是第一个节点进入队列 当队列不空(循环1){ 遍历队列中每节点(循环2){ 将八个...

DFS&BFS(附迷宫解法C++代码)
在迷宫解法中,BFS与DFS的实现类似,前者使用队列,后者则替换为栈。BFS通过遍历队列寻找解,同时标记已访问节点避免循环。DFS则通过递归实现深度优先策略,关键在于决策空间、可行判断与目标设定。广度优先搜索与深度优先搜索在迷宫解法中均展现了朴实无华的高效性,关键是避免循环访问。算法设计与实现时需...

急!!C++深度优先算法和广度优先算法
2. 广度优先搜索 void BFS(Graph G, int visited[]){\/\/按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited.for(v = 0; v < G.vexnum; v++)visited[v] = false;Quene q;for(v = 0; v < G.vexnum; v++)if(!visited[v]){ visited[v] = true;EnQuene(Q,v);while(!

迷宫问题
深度优先算法思路:进行搜索的时候面对很多选择时,每遇到一个合适的就继续递归搜索下去,若失败则回溯到上一层。若画成一颗树的话就是按层数不断往下搜索,失败的时候返回上一层。广度优先算法思路:进行搜索的时候面对很多选择时,先不急着进行递归,而是先把所有的选择都放到一个队列中,然后依次对这些...

深度优先和广度优先 的区别 ,用法。
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。2、算法区别 深度优先搜索是每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱,找到所要找的元素时结束程序。广度优先搜索是每次...

邻接矩阵图的广度优先遍历,用c++实现或c都可以
class queue \/\/用数组实现的循环队列 { public:queue();void empty();bool isEmpty();int front();void push(int e);void pop();private:int arr[150];int head;int end;};queue::queue(){ empty();} void queue::empty(){ head=end=0;} bool queue::isEmpty(){ if(head==en...

相似回答