Distance: 두 vertex 사이에 존재하는 edge의 개수
Graph가 adjacency list를 사용한다고 가정하자.
Undirected Graph를 예시로 들어보자.
discover: source vertex로부터 reachable 한 vertexs
distance 기준으로 오름차순으로 reachable한 vertex를 정렬하는 것이 목표이다.
Predecessor subgraph of G:
BFS (G, s)
1. for each vertex u in G.V - {s}
2. u.color = WHITE
3. u.d = inf
4. u.π = NIL
5. s.color = GRAY
6. s.d = 0
7. s.π = NIL
8. Q = ∅
9. ENQUEUE(Q, s)
10. while Q is not ∅
11. u = DEQUEUE(Q)
12. for each v in G.Adj[u]
13. if v.color == WHITE
14. v.color = GRAY
15. v.d = u.d + 1
16. v.π = u
17. ENQUEUE(Q, v)
18. u.color = BLACK
: source vertex로부터의 distance
: 이전 vertex
Line 1 ~ 9: Initial setting
Line 10 ~ 18: Graph Exploration
Programmer의 이해를 위해 색깔을 이용한다.
discover 되면 queue의 들어감을 생각하자.
GRAY vertex에 adjacency한 vertex를 모두 들려 vertex.color == WHITE라면 color = GRAY, distance += 1, 모두 변화시킨다.
해당 vertexs를 Queue에 push 한다.
한 vertex에 adjacency vertex 더 이상 없다면 vertex color를 BLACK으로 바꾸고 DEQUEUE 된 vertex에 대해 (1) ~ (3) 과정을 반복한다.
Queue가 비었다면 종료한다.

Tree이다.
Color 정보는 programmer의 이해를 돕기 위해 도입한 것
BFS (G, s)
1. for each vertex u in G.V - {s}
2. u.d = inf
3. u.π = NIL
4. s.d = 0
5. s.π = s // 수정 1
6. Q = ∅
7. ENQUEUE(Q, s)
8. while Q is not ∅
9. u = DEQUEUE(Q)
10. for each v in G.Adj[u]
11. if v.π == NIL // 수정 2, V.d == inf도 사용 가능
12. v.d = u.d + 1
13. v.π = u
14. ENQUEUE(Q, v)
전체 Running time은 이다.
Initialization:
Exploring the graph:
모든 edge는 최대 2번 explored 된다.
모든 vertex는 최대 한번 examined 된다.
BFS (G, s)
1. for each vertex u in G.V - {s}
2. u.color = WHITE
3. u.d = inf
4. u.π = NIL
5. s.color = GRAY
6. s.d = 0
7. s.π = NIL
8. Q = ∅
9. ENQUEUE(Q, s)
10. while Q is not ∅
11. u = DEQUEUE(Q)
12. for each v in G.Adj[u]
13. if v.color == WHITE
14. v.color = GRAY
15. v.d = u.d + 1
16. v.π = u
17. ENQUEUE(Q, v)
18. u.color = BLACK
Initializaion
Line 1 ~ 4:
Line 5 ~ 9:
Graph Exploration
Line 11, 18:
Line 12 ~ 17:
인접한 곳만 탐색하며 count를 1씩 늘려야하는 경우에 유리하다.