Inputs: G =(V,E),시작 정점 s
Outputs:
White: 아직 발견 안 한 vertex = white 대신 0으로 표기해도 됌
Gray: 발견은 했지만, adjacency vertices를 아직 다 못 본 정점 = 1
Black: adjacency vertices 까지 탐색이 모두 끝난 정점 = 2
BFS(G, s)
1 for each vertex u in V[G] - {s}
2 color[u] ← WHITE
3 d[u] ← ∞
4 π[u] ← NIL
5 color[s] ← GRAY
6 d[s] ← 0
7 π[s] ← NIL
8 Q ← ∅ // 큐 초기화
9 enqueue(Q, s)
10 while Q ≠ ∅
11 u ← dequeue(Q)
12 for each v in Adj[u]
13 if color[v] = WHITE
14 color[v] ← GRAY
15 d[v] ← d[u] + 1
16 π[v] ← u
17 enqueue(Q, v)
18 color[u] ← BLACK
BFS는 가까운 node 먼저 멀리 있는 node 나중에 방문해야함
-> 거리(depth) 순으로 탐색
실제 최단 경로를 구할 수 있음
각 정점 v에 대해 parentv를 저장 후
목적지 t까지 탐색이 끝난 후
t에서 출발해서 parent[t] -> parent[parent[t] -> ~ -> s
이렇게 거꾸로 올라간 경로를 뒤집으면 s->t 최단 경로임 그럼 출력도 가능함
그래프의 connected 여부 판별가능
방문한 node 수 < 전체 정점 수 이라면 연결 그래프가 아님
각 노드들 탐색 가능
특정 노드에서 레벨 white(0), gray(1), black(2)로 s,s와 인접한 정점들, 레벨 1의 이웃들로 나눌 수 있음
홀수 cycle 존재 여부 판단(Undirected Graph)
BFS로 Coloring 하면서 두 색으로 Coloring 가능 한지 검사 -> 홀수 길이 cycle 있으면 불가능함
인접한 두 정점이 같은 색이 나올 수 없기 때문
-> 이분 그래프 가능
// 이분그래프:그래프 정점을 두 집합 A, B로 나누어서
모든 간선이 A↔B 사이에만 존재하도록 만들 수 있음
예전 백준에서 이 알고리즘으로 문제 풀었던 기억이 난다