1. 程式人生 > >無向圖廣度優先遍歷及其matlab實現

無向圖廣度優先遍歷及其matlab實現

margin cte align style -- als 矩陣 ffffff bre

廣度優先遍歷(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. <[email protected]>
 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實現