【算法】BFS 广度优先遍历由浅入深

//该算法比较重要,看文字的时候最好集中注意力,看不懂多敲几遍代码,对图不了解的可以先百度一下

图的广度优先遍历类似于树的层次遍历,采用的搜索方法的特点是尽可能先对横向结点进行搜索,故称其为广度优先搜索(Breadth-First-Search).

其基本思想是:

给定图 G= (V,  E) 从图中某个源点v出发,在访问了顶点V之后接着就尽可能先在横向搜索V的所有邻接点。在依次访问V的各个未被访问的邻接点w1,w2,....,wk之后,分别从这些邻接点出发依次访问与w1,w2,...,wk邻接的所有未访问过的顶点。依次类推,直至图中所有和源点V有路径相通的顶点都已经访问过为止,此时从V开始的搜索过程结束。若G是连通图,则遍历完成;否则,在图G中另选一个尚未访问的顶点作为新源点继续上述的搜索过程,直至图G中所有顶点均已被访问为止。

采用广度优先搜索法遍历图的方法称为图的广度优先遍历。

对如图所示的无向图G11进行广度优先遍历的过程为:首先访问起始点,假设从C0出发,接着访问与C0邻接的顶点C1和C2,然后依次访问与C1邻接的未曾访问的顶点C3和C4,最后访问与C2;邻接的顶点C5。至此,这些顶点的邻接点均已被访问,并且图中的所有顶点都已被访问,图的遍历结束,得到该图的广度优先遍历(简称BSF序列)为:

                   C0->C1->C2->C3->C5

为确保先访问的顶点其邻接点亦先被访问,在搜索过程中可使用队列来保存已访问过的顶点。当访问V和u时,这两个顶点相继入队,此后,当V和u相继出队时,分别从V和u出发搜索其邻接点V1,V2,..,Vs和u1,u2,..ut,对其中未访者进行访问并将其入队。这种方法是将每个已访问的顶点入队,保证邻每个顶点至多只有一次入队

若图采用邻接表存储结构,则算法如上图的广度优先遍历算法可表示如下

//图的广度优先遍历算法 文件名bfs.c

#include "ljb.h"
int visited[M];  //全局标志向量
//函数功能:从顶点i出发广度优先变量图g的连通分量
//函数参数:图的邻接表g,遍历始点i
//函数返回值:无
void bfs(linkedGraph g,int i)
{
	int j;
	EdgeNode *p;
	int queue[M],front,rear;          //FTFO队列
	front = rear = 0;                 //初始化空队列
	printf("%c",g.adjlist[i].vertex); //访问源点
	visited[i] = 1;
	queue[rear++] = i;                //被访问结点进队
	while (rear > front)              //当队列非空时,执行下列循环体
	{
		j = queue[front++];           //出队
	    p = g.adjlist[j].FirstEdg;
		while (p)
		{
			if (visited[p -&g
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值