BFS 에 대해알아보자
Breadth First Search 의 줄임말
시작점에 가까운 정점부터 방문한다.
3.
BFS 의 기본적인골격
주어진 정점 s ∈ V 에서 도달가능한 모든 정점들을 방문한다.
1. 0번의 이동으로 도달 가능한 정점을 방문
2. 1번의 이동으로 도달가능한 정점들을 방문
3. 2번의 이동으로 도달가능한 정점들을 방문
…
BFS 는 level by level 로 순회하는 특징을 가진다.
BFS 가 실제로사용되는 사례
● Web crawling
● Network Broadcasting
● Garbage Collection
● Checking Mathematical Conj.
● Solving Puzzle & Games
6.
BFS 를 구현하는알고리즘(정석)
모든 정점의 color 속성이 WHITE 라고 가정한다.
(WHITE : 방문 안함, GRAY : 방문할 예정, BLACK : 이미 방문함)
1. 정점 s 를 방문한다 (color GRAY)
2. 큐에 정점 s 에 대한 정보를 삽입한다.
3. 큐가 비어있을때까지 계속해서 반복
a. 큐에서 정점 v 에 대한 정보를 뽑아낸다.
b. 정점을 방문한다. (color BLACK)
c. 정점 v 에 연결된 모든 정점에 대해 다음과 같은 명령을 수행
i. 이미 방문했거나 방문할 예정인 경우(if color == BLACK || color == GRAY), 다음 정점을 검사
ii. 아직 방문한 적이 없을 경우(color == WHITE),
방문할 예정(color GRAY) 이라고 표시하고, 큐에 넣는다
7.
BFS 를 구현하는알고리즘(PS 방식)
모든 정점의 color 속성이 WHITE 라고 가정한다.
(WHITE : 방문 안함, BLACK : 이미 방문함) 혹은 visited[i] = true OR false
1. 정점 s 를 방문한다 (color BLACK)
2. 큐에 정점 s 에 대한 정보를 삽입한다.
3. 큐가 비어있을때까지 계속해서 반복
a. 큐에서 정점 v 에 대한 정보를 뽑아낸다.
b. 정점을 방문한다. (color BLACK)
c. 정점 v 에 연결된 모든 정점에 대해 다음과 같은 명령을 수행
i. 이미 방문했거나 방문할 예정인 경우(if color == BLACK), 다음 정점을 검사
ii. 아직 방문한 적이 없을 경우(color == WHITE),
방문할 예정(color BLACK) 이라고 표시하고, 큐에 넣는다
어차피 방문할 예정이니까
방문했다고 퉁치는 방법
8.
#1 level 을이용해서 푸는 문제
BFS 는 level by level 로 순회하는 특징을 가진다.
(Level : 루트로부터 한 정점에 도달하기 위해 거쳐야 하는 간선의 갯수의 최솟값)
A
B C
D
F
H
G
Level : 0
Level : 1
Level : 2
9.
몇번째 레벨까지 도달해야탐색이 끝나는가?
[TIP] 다차원 배열을 XYZ 좌표를 이용하여 탐색해야 하는 경우,
ARR[Z][Y][X], ARR[y][x] 같은 순서대로 접근하는 것이 좋다.
(대회나가면 x,y,z 를 어느 인덱스로 접근해야 할 지 합을 맞춰야 하는데,
일반적으로 위와 같은 경우가 무난함)
https://www.acmicpc.net/problem/7576
https://www.acmicpc.net/problem/7569
Bipartite Graph 판별알고리즘 구현하기
1. 일단 bipartite 라고 가정한다.
2. 주어진 정점을 검은색이라 지정한다
3. 큐에 집어넣는다.
4. 큐가 빌 때까지 혹은 이분그래프가
아닐때까지 반복(BFS 방식)
a. 큐의 맨 앞에 들어간 원소(정점을 의미)를 뺀다.
b. 연결된 정점을 자기 자신과 다른 정점으로 칠한다
i. 칠해져 있지 않은 경우, 검은색(혹은 흰색)
으로 칠하고 큐에 집어넣는다.
ii. 이미 칠해져 있고, 자기 자신과 같은 색깔인
경우 이분 그래프가 아니라고 결론내리고
루프를 빠져나온다
22.
Bipartite Graph 인지확인하는 문제
http://www.acmicpc.net/problem/1707
C E
A B
D
F
G
H
비연결 그래프가
입력으로 주어질 수도
있음을 주의할 것
23.
#3 Topological Sort
그래프이론 용어 정리
● degree(차수) : 한 정점에 연결된 간선의 갯수
● In-degree(입차수) : 주어진 정점이 sink 가 되는 간선의 갯수
● out-degree(출차수) : 주어진 정점이 source 가 되는 간선의 갯수
v
indegree(v) = 2
outdegree(v) = 3
24.
#3 Topological Sort(DFS 복습)
Void TopologicalSort(int u) {
Visited[u] = true;
for(auto v : graph[u])
if(!visited[v]) TopologicalSort(v); // 여기까지만 보면 DFS 와 유사함
stack_tmp.push(u); // 순회를 끝낸 노드는 push 해준다.
}
dependency가 없는 정점을 우선순위를 두더라도
구체적으로 어느 기준으로 정렬할 지 기준이 없으면 정답은 없음
생각해보면, 함수의 호출순서에 따라 정렬하는 것이라고 생각할 수도 있음.
25.
#3 Topological Sort(좀 더 직관적인 BFS)
함수의 호출순서가 아닌 다른 방법으로 생각해보자.
함수의 호출순서가 아닌 좀 더 본질적으로 dependency(precedence)의 관점에서
생각한다면?
그래서 나온 것이 Khan’s algorithm
26.
#3 Topological Sort(Khan’salgorithm)
Dependency(precedence) 의 갯수를 level 로 하여 level by level 로 순회한다.
Dependency(precedence) 의 갯수는 어떻게 생각할 것인가? => indegree
v
indegree(v) = 2
outdegree(v) = 3
#3 Topological Sort(Khan’s algorithm)
1. Indegree 가 0인 정점들을 queue 에 넣는다.
2. Queue 가 비어 있을 때까지 계속해서 반복
a. Queue 에서 정점을 뽑아낸다.
b. Queue 에서 뽑아낸 정점에 가까운 원소들의
indegree 를 1 씩 감소시키고,
0이 될 경우 queue 에 집어넣는다.
c. 2-b 의 과정을 끝내고 나면, 정점을 출력.
(Queue 가 순서를 보장하기 때문에
2-b 이전에 해도 상관없음)
Priority Queue 를 써도 Topological Sort 를 보장함
30.
BFS 위상정렬을 이용해서풀 수 있는 문제
https://www.acmicpc.net/problem/1766 : 가능한 쉬운 문제부터 풀어야 한다는
전제조건
BFS 에 먼저 뽑아내야 하는
원소의 조건이 들어가는
문제는
Priority queue를 사용할 것
31.
다루지 않은 문제들
●Solving Puzzles & Games : 필요에 따라서는 DP 기법이 필요함
● MCMF
● Shortest Paths : 이건 다음주
● Minimum Spanning Tree : 이건 다다음주
32.
DFS VS BFS
일단문제의 특성을 보고 판단하는 것이 좋다.
O(V+E) DFS O(V+E) BFS
장점
● 메모리를 덜 쓰게 됨
● 코드로 구현하기가 조금 더
간결함
● 모든 경로를 탐색하고 결과를
확인할 수 있다.(stacktrace)
● 다른 정점까지 도달하는데 최소 몇번의
움직임이 필요한지 구할 수 있다.
단점
● 다른 정점까지 도달하는데 몇번
움직여야 하는지 기록하기
어려움
● 한쪽으로 치우쳐 있는데, 깊이가
상당할 경우 stack overflow
가능성
● 보통 메모리를 더 쓰게 됨. (탐색범위가
엄청 넓고, 어디를 탐색해야할지
기억해야하기 때문)
● 그래프가 크다면 조금 고민해봐야함
사용예시
● Articulation Point, Bridge, SCC, ● 우선순위가 필요한 Topological Sort,
Checking Bipartite Graph
33.
전략을 잘 짜자
●DFS를 쓰면 좋은 경우
○ 모든 경로를 탐색하고 그 결과를 확인해야하는 경우( 방문한 경로를 순서대로 출력 )
○ 문자열 등을 탐색할 때 “사전 순서로 앞에 오는 것” 처럼 앞부터 검색해서 찾는 것이 빠를 경우
● BFS 를 쓰면 좋은 경우
○ 시작 지점에서 가장 가까운 것을 구하고 싶은 경우
○ 탐색범위 자체는 넓지만 어느정도 근처에 구하고 싶은 해가 존재하는 것을 알고 있는 경우
○ 탐색 범위가 굉장히 넓으며 깊이 우선 탐색을 사용할 때는 스택이 대량으로 사용되는 경우