9.5 연습 문제¶
9.5.1 개념 확인¶
1. 같은 그래프를 두 가지 방식으로 표현하기¶
무방향 그래프의 정점은 A, B, C, D 4개이며, 간선은
A-B, A-C, B-C, C-D다.
- 이 그래프의 인접 리스트를 적어 보자.
- 0과 1만 들어가는 인접 행렬을 완성해 보자.
A와D가 직접 연결되어 있는지 판단할 때, 저장된 항목 하나만 확인하면 되는 표현 방식은 무엇인가?- 정점이 많고 간선이 적다면 일반적으로 어느 표현 방식이 공간을 더 절약하는가?
참고 답안
-
인접 리스트는 다음과 같다.
-
인접 행렬은 다음과 같다.
A B C D A 0 1 1 0 B 1 0 1 0 C 1 1 0 1 D 0 0 1 0 -
인접 행렬에서는
A행과D열이 만나는 항목을 바로 확인할 수 있다. 따라서 임의의 두 정점이 직접 연결되어 있는지 판단하기에 적합하다. -
정점이 많고 간선이 적을 때 인접 리스트는 실제로 존재하는 간선만 기록한다. 따라서 모든 정점 쌍에 대해 자리를 마련하는 인접 행렬보다 일반적으로 공간을 더 절약한다.
2. 너비 우선 탐색과 깊이 우선 탐색의 방문 순서¶
무방향 그래프의 정점은 A, B, C, D, E이며, 간선은
A-B, A-C, B-D, C-D, D-E다.
A에서 출발하고, 방문하지 않은 인접 정점이 여러 개면 알파벳순으로 선택한다고 하자.
- 너비 우선 탐색(BFS)의 방문 순서를 적어 보자.
- 재귀 깊이 우선 탐색(DFS)의 방문 순서를 적어 보자.
- 두 탐색 모두 이미 방문한 정점을 기록해야 하는 이유는 무엇인가?
참고 답안
-
BFS의 방문 순서는
A, B, C, D, E다. A에서 간선 하나로 도달하는 B와 C를 먼저 방문하고, 그다음 더 멀리 있는 D와 E를 방문한다. -
DFS의 방문 순서는
A, B, D, C, E다. 현재 정점에서 방문하지 않은 인접 정점으로 차례대로 들어가므로 먼저A → B → D → C를 따라간다. C에서 새로 방문할 인접 정점이 없으면 D로 돌아와 E를 방문한다. -
그래프에는
A-B-D-C-A와 같은 사이클이 있다. 이미 방문한 정점을 기록하지 않으면 같은 정점들을 사이클을 따라 반복해서 방문하여 탐색이 정상적으로 끝나지 않을 수 있다.
3. BFS 한 번으로 그래프 전체를 방문할 수 있는가¶
무방향 그래프의 정점은 A, B, C, D, E, F이며, 간선은
A-B, B-C, D-E뿐이다.
- A에서 BFS를 한 번 시작하면 어떤 정점을 방문할 수 있는가?
- 1번의 결과를 바탕으로, 이 BFS가 그래프의 모든 정점을 방문했는지 판단하고 이유를 설명하라.
- 모든 정점을 알파벳순으로 확인하면서 방문하지 않은 정점을 만날 때마다 BFS를 새로 시작한다면, 각 BFS의 시작 정점은 무엇인가? 이 그래프는 서로 연결되지 않은 부분인 연결 요소 몇 개로 이루어져 있는가?
참고 답안
-
A에서 출발하면
A, B, C만 방문할 수 있다. -
모든 정점을 방문한 것은 아니다.
D, E는 서로 연결된 별개의 부분을 이루고, F는 홀로 떨어진 정점이다. 이 정점들과 A 사이에는 경로가 없으므로 A에서 출발해서는 도달할 수 없다. -
세 번의 BFS는 차례대로
A, D, F에서 시작하여 각각{A, B, C},{D, E},{F}를 방문한다. 따라서 이 그래프의 연결 요소는 3개다.
9.5.2 프로그래밍 연습¶
1. 무방향 그래프에 경로가 존재하는지 판단하기¶
정점이 \(n\)개인 무방향 그래프가 주어지며, 정점 번호는 \(0\)부터 \(n-1\)까지다. 배열 edges의 각 항목 [u, v]는 정점 u와 v 사이에 무방향 간선이 있음을 나타낸다.
시작 정점 source와 도착 정점 destination도 주어진다. 먼저 edges로 인접 리스트를 만든 뒤 BFS 또는 DFS를 사용하여
source에서 destination까지의 경로가 있는지 판단하라. 있으면 true를, 없으면 false를 반환하라.
그래프에는 사이클이 있을 수 있으며, 모든 정점이 서로 연결되어 있지 않을 수도 있다.
풀이 힌트
- 무방향 간선은 양쪽 방향을 모두 추가해야 한다.
- 그래프에는 사이클이 있을 수 있으므로 이미 방문한 노드를 반드시 기록해야 한다.
- source에서 출발하여 destination을 만나면 true를 반환한다. 탐색을 마칠 때까지 만나지 못하면 false를 반환한다.