《数据结构和算法》之图的广度优先遍历

一,广度优先遍历,又称为广度优先搜索,简称BFS。举例说明,在一套房子里找一个钥匙,利用深度优先搜索就是搜索每一个房间,而广度优先搜索,是先看看钥匙有没有放在各个房间的明显位置,如果没有,再看看各个房间的抽屉有没有,这样逐步扩大查找的范围的方式我们称之为广度优先搜索。

                            《《数据结构和算法》之图的广度优先遍历》

                                                                                                             图1  示例图

      从图1中可以看到右边的图形看着很整洁好看,深度优先遍历类似于树的前序遍历,广度优先遍历就类似于右边的树的层序遍历,一层一层逐步往下直到遍历完所有的顶点为止。要是实现图1中右边的图的遍历,可以使用队列来实现:

                                                                              《《数据结构和算法》之图的广度优先遍历》

                                                                                                            图2  队列实现图

         在图2中可以看到,出队列的顺序就是ABFCIGEDH。

二,邻接矩阵的广度优先遍历

          

//邻接矩阵的广度遍历算法
void BFSTraverse(MGraph G)   //传进来一个图G
{
	int i,j;
	Queue Q;                 //增加一个队列
	
	for( i=0; i<G.numVertexes; i++)     //创建一个是否被访问的标志,numVertexes是记录一个顶点数的元素
	{
		visited[i] = FALSE;             //这个数组来存放是否被访问的标志,初始化为FALSE
	}
	
	initQueue(&Q);   //初始化队列   
	
	for(i=0;i<G.numVertexes; i++)       
	{
		if(!visited[i)                  //没有被访问过的时候才进行执行以下操作
		{
			printf("%c",G.vex[i]);      //打印访问的顶点
			visited[i] = TRUE;          //标志为已经访问
			EnQueue(&Q,i);              //插入队列
			
			while(!QueueEmpty(Q)        //建立一个迭代,只要队列不为空就进行循环迭代
			{
				DeQueue(&Q, &i);        //弹出队列,存放i这个变量里面
				for(j=0;j<G.numVertexes;j++)  
				{
					if(G.art[i][j]==1 && !visited[j])//判断说从i到j是否有边连接起来,如果连接了即结果为1.或者判断j没有被访问过
					{
						printf("%c",G.vex[j]);    //打印结点
						visited[j] = TRUE;        //标记为已经访问
   						EnQueue(&Q, j);           //插入队列
					}
				}
			}
		}
	}
}

           代码具体的说明已经在程序注释中写的很清楚了。

          

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/huangchijun11/article/details/64118537
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞