首页 > 其他分享 >图(树)的广度优先遍历bfs

图(树)的广度优先遍历bfs

时间:2023-12-21 21:11:07浏览次数:19  
标签:优先 遍历 队列 bfs int 邻接 广度

图的广度优先遍历

广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。
广度优先遍历
由于广度优先是一层一层节点的遍历,在图的边权值都为1的情况下,若我们要求出节点a到节点b的最短路,就可以以a为源点(source)进行广搜,当a第一次搜到b时,其路径一定最短。因为在广搜时每一层的节点距离a的距离都是相同的,层数越多距离a越远,因此第一次搜到b时,b所在的层数最小,于是距离a的距离也就最小

不论是图的广搜还是树的广搜,我们都可以看到他们都是从源点开始,逐层搜索源点的邻接点及其邻接点的邻接点。因此我们需要一个数据结构来存储一个点的所有邻接点,于是我们选择队列来实现深度优先搜索。

方便起见可以使用queue库来建立一个队列,但当想存储整个队列的状态时可以选择自己建立一个队列
这里图的存储采用邻接表法使用vector来存

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 10;
vector<int> h[N];
queue<int> q;
int s;
bool check[N];
void bfs()
{
	q.push(s);//将源点压入队列
	while (!q.empty())//队列不空就继续遍历
	{
		int k = q.front(); q.pop();//从队列中取出一个节点
		for (int i = 0; i < h[k].size(); i++)
		{
			int temp = h[k][i];
			if (!check[temp])//将其未遍历到的邻接点存储进去
			{
				check[temp] = true;
				q.push(temp);
			}
		}
	}
}

标签:优先,遍历,队列,bfs,int,邻接,广度
From: https://www.cnblogs.com/CrescentWind/p/17920126.html

相关文章

  • 图(树)的深度优先遍历dfs
    图的深度优先遍历深度优先,即对于一个图或者树来说,在遍历时优先考虑图或者树的单一路径的深度。示意图如下即深度优先搜索的核心就是对一个路径一直向下搜索,当搜索到头时就回溯到前一状态再寻找别的路深搜问题一般有两种情况,一种是搜索时元素只能用有限次,这需要我们定义一......
  • 交个崔鹏题 OJ实践1-C /图的广度搜索/C++
    #include<iostream>#include<malloc.h>#include<queue>usingnamespacestd;#defineMAX10typedefintE;typedefstructNode{ intnextVex; structNode*next;}*node;structHeadNode{ Eelement; structNode*next;};typedefstruct......
  • BFS模板
    #classSolution:#defBFS(self,start,target):#q=[]#用一个列表做队列#v=[]#记录走过的路#q.append(start)#把起点放入队列#v.append(start)#加入走过的路#step=0#记录扩散步数#while......
  • 21_从中序与后序遍历序列构造二叉树
    106.从中序与后序遍历序列构造二叉树给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗二叉树。示例1:输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]......
  • 集合遍历方式
    packagebackend01;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassPractice05{publicstaticvoidmain(String[]args){Collection<String>list=newArrayList<>();//Collection是个接......
  • 【CF1661B】Getting Zero(广度优先搜索)
    题目大意:每次操作可以把\(v\)变成\((v+1)\mod32768\)或\((2\timesv)\mod32768\),求\(v\)变成\(0\)最少需要操作几次。\(v\)等于\(0\)时答案为\(0\),我们将\(0\)标记,然后让\(0\)入队。然后不断进行以下操作,直到队列为空:1.取出队列头部元素,设为\(x\)。2.找出能通过一次操作变......
  • C++ 反向遍历 array 小记
    有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些bug记录在这里。首先arr.size()的数据类型为size_t,为无符号整型对于for(intidx=arr.size()-1;idx>=0;idx--):使用int作为idx的类型,有一定概率会编译失败,因为size_t的具......
  • 使用遍历后数据加入新的div块中
    我们经常使用的数据他会成一个整体放入块中,但我们有时需要将他们分开使用,让他们展示在不同的div块中。所以就有了今天这篇博文。我们经常使用的遍历是这样的vararr=[5,3,8,2,4,9,6]for(vari=0;i<=a.length-1;i++)但我们遍历以后怎么去给他放入新的div块中呢所以我们要创......
  • Python算法——二叉树遍历
    Python中的二叉树遍历算法详解二叉树是一种常见的树状数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。遍历二叉树是访问树的所有节点并按照特定顺序输出它们的过程。在本文中,我们将讨论二叉树的三种主要遍历算法:前序遍历、中序遍历和后序遍历,并提供相应的Python代码......
  • 集合遍历
    importjava.util.ArrayList;//创建一个集合,添加内容并遍历,规范打印格式:[元素一,元素二,元素三]//集合中如果想添加基本数据类型要转换成包装类publicclassPractice01{publicstaticvoidmain(String[]args){ArrayList<Integer>list=newArrayList<>();......