码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-10-07 20:49:08      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:margin   atl   family   作者   辐射   png   文件   empty   img   

 

广度优先遍历(breadth-first traverse,bfts),称作广度优先搜索(breath 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.0
 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 (Dist) 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实现

标签:margin   atl   family   作者   辐射   png   文件   empty   img   

原文地址:http://www.cnblogs.com/athlonreg/p/7635590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!