無向圖廣度優先遍歷及其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   

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM