广度优先遍历(邻接表,邻接矩阵)

这篇具有很好参考价值的文章主要介绍了广度优先遍历(邻接表,邻接矩阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    广度优先遍历又称为广度优先搜索,简称BFS

    如果说图的深度优先遍历(图的深度优先遍历相关内容:图的深度优先遍历)类似树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历。

    具体遍历过程如下图所示:

广度优先遍历(邻接表,邻接矩阵)

    就如上面的第三个图上所编写的序号进行遍历

    我们要实现这样的遍历方法需要一个辅助队列,将处理过后的顶点(比如输出顶点)放入队列中,在找邻接点时找的便是队列顶部的顶点的邻接点,将队列顶部的顶点出队列后获得出队列的顶点的下标,根据下标找到该顶点的所有邻接点,再将所有邻接点依次放到队列中,循环往复直到队列中没有顶点,就遍历完了一个连通图。

    上面图的队列的变化过程:

广度优先遍历(邻接表,邻接矩阵)

 当然我们需要一个标志数组,在遍历到顶点后,标记该顶点已被遍历过,避免重复遍历到相同的顶点。

  代码展示:

    ps:该代码包括了队列以及无向网图的创建过程,所以我们需要注意的是邻接矩阵的广度遍历算法:BFSTraverse函数。有关队列的创建以及相关操作可看这里:循环队列,邻接表和邻接矩阵的创建细节可看这里:邻接矩阵,邻接表

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型
#define MAXVEX 20//最大顶点数(开辟储存顶点的一维数组的空间大小)
#define INFINITY 10000//用10000来代表无穷(在储存边的二维数组中,对没有该边存在的表格,权值设为无穷)
//定义图的结构体(图由储存顶点的一维数组和储存边的二维数组,以及记录图中结点数和边数的int类型的变量组成)
struct MGraph
{
	VertexType vexs[MAXVEX];//储存顶点的一维数组
	EdgeType arc[MAXVEX][MAXVEX];//储存边的二维数组
	int Num_vex, Num_arc;//图中的顶点数和边数
};

//定义队列的结构体
struct Queue
{
	//队列储存顶点下标
	//作为队列的数组
	int data[MAXVEX];
	//头指针
	int front;
	//尾指针
	int rear;
};

//初始化队列
void InitQueue(Queue& q)
{
	q.front = 0;
	q.rear = 0;
}

//入队列
void EnQueue(Queue& q, int& index)
{
	//判断队列是否已满
	if ((q.rear + 1) % MAXVEX == q.front)
		return;
	//将数据index放入队列
	q.data[q.rear] = index;
	q.rear = (q.rear + 1) % MAXVEX;
}

//出队列
//将出队列的数据赋给index
void OutQueue(Queue& q, int& index)
{
	index = q.data[q.front];
	q.front = (q.front + 1) % MAXVEX;
}

//判断队列是否为空
bool Juge_Queue(Queue& q)
{
	if (q.front == q.rear)
		//为空返回false
		return false;
	//不为空返回true
	return true;
}

//无向网图的创建
void Create_MGraph(MGraph& G)
{
	int m, n;
	cout << "请输入图的顶点数和边数" << endl;
	cin >> G.Num_vex >> G.Num_arc;
	cout << "请依次输入图的顶点:" << endl;
	for (int i = 0; i < G.Num_vex; i++)
	{
		cin >> G.vexs[i];
	}
	//初始化储存边的二维数组
	for (int i = 0; i < G.Num_vex; i++)
		for (int j = 0; j < G.Num_vex; j++)
		{
			G.arc[i][j] = INFINITY;
		}
	//向二维数组中输入对应边的权值
	for (int k = 0; k < G.Num_arc; k++)
	{
		cout << "请依次输入边(Vm,Vn)的下标m,n" << endl;
		cin >> m >> n;
		cout << "请输入边(" << G.vexs[m-1] << "," << G.vexs[n-1] << ")的权值" << endl;
		cin >> G.arc[m - 1][n - 1];
		//由于是无向网图,所以存在边(m,n),就存在边(n,m)所以我们还应该向二维数组的(n,m)位置输入权值
		G.arc[n - 1][m - 1] = G.arc[m - 1][n - 1];
	}
}


//邻接矩阵的广度遍历算法
void BFSTraverse(MGraph& G)
{

	//标志数组
	//false表示在顶点数组中该下标的顶点没有被遍历过
	bool visited[MAXVEX];
	//初始化标志数组
	for (int i = 0; i < G.Num_vex; i++)
	{
		visited[i] = false;
	}
	//定义队列q
	Queue q;
	//初始化队列
	InitQueue(q);
	//找出一个连通中用于开始遍历的顶点
	//遍历所有结点为了避免图中有不连通的情况,要是图中顶点都是连通的可以不用for循环这一步(但你要先定义一个首次遍历的顶点i)
	for (int i = 0; i < G.Num_vex; i++)
	{
		if (!visited[i])
		{
			//遍历到了标志改为true
			visited[i] = true;
			//输出遍历到的顶点
			cout << G.vexs[i] << " ";
			//将遍历到的顶点的下标放入队列
			//为了一会找该顶点的邻接点
			EnQueue(q, i);
			//找邻接点
			//队列不为空就一直寻找邻接点
			while (Juge_Queue(q))
			{
				int index;
				OutQueue(q, index);
				for (int j = 0; j < G.Num_vex; j++)
				{
					if (G.arc[index][j] != INFINITY && !visited[j])
					{
						visited[j] = true;
						cout << G.vexs[j] << " ";
						EnQueue(q, j);
					}
				}
			}
		}
	}
}
int main()
{
	MGraph G;
	Create_MGraph(G);
	BFSTraverse(G);
	system("pause");
	return 0;
}

    上面程序中所包含的BFSTraverse函数是用于遍历邻接矩阵的,而遍历邻接表也只是因为邻接表与邻接矩阵构造不同而有细微的差异,具体思路没有变化。

    这里我们就只展示遍历的函数

邻接表遍历:文章来源地址https://www.toymoban.com/news/detail-499574.html

/标志数组
//false表示对应下标的顶点数组中的顶点没有被遍历过
bool visited[MAXSIZE];
//邻接表的广度优先遍历
void BFSTraverse(GraphAdiList& G)
{
	Queue q;
	//初始化队列q
	InitQueue(q);
	//初始化标志数组
	for (int i = 0; i < G.numVertex; i++)
	{
		visited[i] = false;
	}
	//找到第一个用来遍历的顶点
	for (int i = 0; i < G.numVertex; i++)
	{
		if (visited[i] == false)
		{
			visited[i] = true;
			cout << G.Adjext[i].vetex << " ";
			//入队列
			//将下标i入队列
			EnQueue(q, i);
			while (Judge_Queue(q) == true)
			{
				int index;
				//出队列
				OutQueue(q, index);
				//边表结点指针s用来遍历边表
				EdgeNode* s = G.Adjext[index].FirstEdge;
				while (s)
				{
					if (visited[s->adjvex] == false)
					{
						visited[s->adjvex] = true;
						cout << G.Adjext[s->adjvex].vetex << " ";
						EnQueue(q, s->adjvex);
						s = s->next;
					}
				}
			}
		}
	}
}

到了这里,关于广度优先遍历(邻接表,邻接矩阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构实验6 :图的存储与遍历(邻接矩阵的深度优先遍历DFS和邻接表的广度优先遍历BFS)

    利用邻接矩阵存储无向图,并从0号顶点开始进行深度优先遍历。 输入第一行是两个整数n1 n2,其中n1表示顶点数(则顶点编号为0至n1-1),n2表示图中的边数。 之后有n2行输入,每行输入表示一条边,格式是“顶点1 顶点2”,把边插入图中。 例如: 4 4 0 1 1 3 0 3 0 2 先输出存储

    2024年02月09日
    浏览(54)
  • 基于邻接矩阵的有向图的广度优先遍历(BFS)和深度优先遍历(DFS)算法

    概念: 广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。 以迷宫为例,广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方

    2024年02月06日
    浏览(49)
  • 对无向图进行邻接矩阵的转化,并且利用DFS(深度优先)和BFS(广度优先)算法进行遍历输出, 在邻接矩阵存储结构上,完成最小生成树的操作。

    目录 一 实验目的 二 实验内容及要求 实验内容: 实验要求: 三 实验过程及运行结果 一 算法设计思路 二 源程序代码 三、截图 四 调试情况、设计技巧及体会 1.掌握图的相关概念。 2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。 3.掌握图的深度优先搜索和广度优

    2024年02月04日
    浏览(44)
  • 邻接表按深度优先遍历和按广度优先遍历的序列

    求此邻接表的深度优先遍历序列和广度优先遍历序列。   深度优先:按深度优先遍历时会有类似\\\"跳转\\\"的操作,比如例1中顶点v1→边v2后,会直接跳转到顶点v2去,再重新从顶点v2→边v1,由于v1访问过,所以变为v2→边v5,再跳转到顶点v5去,直到每个顶点都被访问过。抽象理解

    2024年02月04日
    浏览(34)
  • C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

    目录 1.图的基本概念 2.图的存储结构 2.1邻接矩阵 2.2 邻接表 3.图的遍历 3.1广度优先遍历 3.2图的深度遍历  总结: 图是由顶点集合以及顶点之间的关系组成的一种数据结构:G = (V,E),其中顶点集合V={x|x属于某个对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {x, y|x,y属于V Pa

    2024年02月06日
    浏览(39)
  • 数据结构——图篇(邻接矩阵、邻接表、深度优先搜索、广度优先搜索)

    描述 图比树更为复杂,展现的是一种多对多的关系,图的结构是任意两个数据对象之间都可能存在某种特定的关系的数据结构 概念 顶点 : 基本介绍 顶点集合表示为V集合,要求图中顶点至少要有一个,即V集合不能为空集。通常使用|V|来表示顶点的个数,通常使用E(V)来表示

    2024年02月04日
    浏览(30)
  • 图、邻接矩阵、广度与深度优先、生成树

    最近突然被问到这个问题,于是复习一下,用最通俗的语言解释。 无向图 :如下左图各个顶点之间用不带箭头的边连接的图;相应的右图就是 有向图                 可以理解为表示上述图中顶点与顶点之间是否有直接相连的边(有则是1,无则是0),描述这种关系的二维

    2024年02月04日
    浏览(25)
  • 深度优先遍历(邻接矩阵,邻接表)

        深度优先遍历也称为深度优先搜索,简称为DFS。     深度优先遍历的思路是从图中某个顶点V出发,访问此顶点,然后从V的未被访问过的邻接点出发深度优先遍历图,直到图中所有与V路径相通的顶点都被访问到     该遍历过程用到递归。     深度优先遍历用到了一个辅

    2024年02月08日
    浏览(30)
  • 【数据结构】图的创建(邻接矩阵,邻接表)以及深度广度遍历(BFS,DFS)

    图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中: 顶点集合V = {x|x属于某个数据对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {x, y|x,y属于V Path(x, y)}是顶点间关系的有穷集合,也叫 做边的集合。 完全图:在有n个顶点的无向图中,若有n * (n-1)/2条边,

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包