2014-06-13

Breadth First Search 廣度優先搜尋

1. 給一個Graph = G(V,E),以及source vertex s
2. 找出所有s可抵達的vertex
3. 計算從s到每一個可抵達的vertex的最少edges數量
4. 產生BF Tree,s為root,而其他可抵達的vertex都會慢慢加入tree裡。




使用的資料結構:
(1) color:記錄目前vertex的discovery狀態
    (a) WHITE: 還沒被discovered
    (b) GRAY:  已經被discovered,
               但和該vertex相鄰的node還沒全部被discovered
    (c) BLACK: 已經被discovered,
               且和該vertex相鄰的node都已經被discovered
(2) π:記錄parent是誰
(3) d:記錄和root的距離








line 1~4:
初始化除了root以外的所有vertex

line 5~7:
初始化root,GRAY代表一開始root就是被找到的

line 8~9:
初始化Queue(裡面只有root)

line 11:
從FIFO Queue取出node,裡面都是GRAY的vertex

line 12~17:
對每個和u相連的vertex,
若該vertex尚未被discovered,則:
(1) 塗成GRAY
(2) 距離 = u.d+1
(3) parent為u
(4) 把vertex推入Queue的尾端

line 18:
與u相鄰的點都已經discovered,因此塗成BLACK

Introduction to Algorithms Fig. 22.3

首先會初始化每個node,
除了root以外的所有node裡面都填∞,
代表root到每個node的距離是無限大。

用一個FIFO Queue來儲存gray nodes:
(a) 初始化,一開始Q裡只有root(s)
(b) 從Q裡取出s,跟s相鄰的是w,r,因此把w,r推入Q裡(順序不重要)
(c) 從Q裡取出w,跟w相鄰的是x,t,因此把x,t推入Q裡
依此類推,
用Q裡的每個node,再去discover與該node相鄰的其他node。

node裡的值,填該node的parent-node值加1:
(b) w,r的parent是s,s裡面的值是0,因此w,r裡面填1
(c) x,t的parent是w,w裡面的值是1,因此x,t裡面填2
依此類推,
在該node被discovered時就會計算好distant的值了。
(也就是計算從root到該node的最少edges數量)


Note:
(1) s到任何vertex v,都只有一種path,
    而此path即為s->v的最短路徑。
(2) 因為每個edges沒有weight,
    因此這邊的「最短路徑距離」定義為s->v的「最少edges數量」,
    與真正有意義的最短路徑有些不同。

沒有留言:

張貼留言