无向图广度优先遍历及其matlab实现

Posted Le.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无向图广度优先遍历及其matlab实现相关的知识,希望对你有一定的参考价值。

 

广度优先遍历(breadth-first traverse,bfts),称作广度优先搜索(breadth first search)是连通图的一种遍历策略。之所以称作广度优先遍历是因为他的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域。

算法描述

给定图G=(V,E)。V是节点集合,E是边集合。

设定一个访问标志位vflag(i)表示节点i的访问情况,若vflag(i)=0表示节点i未被访问

vflag(i)=1表示节点i已经被访问过。

l  初始化所有节点的vflag=0。

l  从图中某个节点V0出发(该节点可以是任意的),并访问此顶点。

l  从V0出发,访问V0的各个未曾访问的邻接点(下标从小到大排列)W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点。

l  重复上步,直到全部顶点都被访问为止。

 

 

For example,

 

fig1. 5节点无向图

假设我们先从V3 节点开始,把V3装进遍历结果队列和缓存队列。将V3访问标志位置1。取出缓存队列首位后并丢弃。这里是V3节点。找出与V3节点相邻的并未被访问过的节点有。有V1和V5节点,按下标大小我们将V1和V5分别装进缓存队列和遍历队列。自此。缓存队列是[1,5]。遍历队列是[3,1,5]。此时缓存队列没有丢空,我们继续重复之前的步骤。即取出并丢弃缓存队列队首V1。找出与V1相邻并未访问过的节点,有V2,V4.. 此时缓存队列是[5,2,4],遍历队列是[3,1,5,2,4]。此时,已经完成遍历。缓存队列还未被丢空,继续重复上述步骤。即取出并丢弃缓存队列队首V5,找出与V5相邻未被访问的节点,没有。V3相邻但是V3已被访问。此时缓存队列是[2,4],遍历队列是[3,1,5,2,4]。类似丢V2,V4直至缓存队列丢空。实际为节省程序运行时间可将遍历结束条件设为访问标志队列全部非0。

 

bfst matlab 代码

 1 %==========================================================================
 2 % 文件名:        bfstdemo.m             
 3 % 版本号:        1.0.1
 4 % 作者:          Le. <zoreyosa@foxmail.com>
 5 % 单位:          specter
 6 % 修改时间:      Sat Oct. 7 16:24:02 2017
 7 % 创建时间:      Sat Oct. 7 16:24:02 2017
 8 %--------------------------------------------------------------------------               
 9 % blog:http://www.cnblogs.com/athlonreg
10 % Copyright (c) 2017 Le. All rights reserved. 
11 %==========================================================================
12 
13 %% 清空环境变量
14 close all
15 clear all
16 clc
17 
18 A=[0 1 1 1 0;
19    1 0 0 1 0;
20    1 0 0 0 1;
21    1 1 0 0 0;
22    0 0 1 0 0 ];                  % 输入邻接矩阵
23 [m n]=size(A);
24 nodeNum=m;                       % 节点数
25 vflag=zeros(nodeNum,1);          % 初始化所有节点访问标志位
26 queue=[];                        % 遍历缓存队列,每次访问并丢弃队首
27 result=[];                       % 遍历结果
28 startNode=1;%unidrnd(nodenum);   % 从任意节点出发
29 queue=[queue;startNode];         % 更新遍历缓存队列
30 vflag(startNode)=1;              % 更新访问标志
31 result=[result;startNode];       % 更新遍历结果队列
32 % while isempty(queue)==false
33 while all(vflag)==0
34     i=queue(1);
35     queue(1)=[];
36     for j=1:n
37         if(A(i,j)>0&&vflag(j)==0&&i~=j)
38             queue=[queue;j];
39             vflag(j)=1;
40             result=[result;j];
41         end
42     end
43 end   

 

 

以上是关于无向图广度优先遍历及其matlab实现的主要内容,如果未能解决你的问题,请参考以下文章

算法导论—无向图的遍历(BFS+DFS,MATLAB)

图的遍历广度优先遍历(DFS)深度优先遍历(BFS)及其应用

以邻接多重表为存储结构,实现连通无向图的深度优先遍历和广度优先遍历。

数据结构—无向图创建邻接矩阵深度优先遍历和广度优先遍历(C语言版)

Java实现无向图的邻接列表表示,深度遍历及广度遍历

无向图的广度优先遍历算法(bfs)