Spanning  Tree

 

이산수학 : Richard Johnsonbaugh 저서, 강홍식.김정인.이도훈.이명재 번역, 교보문고, 1999 (원서 : Discrete Mathematics 6th ed, Prentice-Hall, 1997), Page 469~475

 

이 절에서는, 그래프 G 의 모든 정점들을 포함하는 트리인 부분 그래프 T 를 찾는 문제를 고려해 본다. 이런 트리를 신장 트리 (spanning tree) 라고 부른다. 신장 트리를 찾는 방법이 다른 문제들에도 잘 적용될 수 있다는 것을 보일 것이다.

그림 1  그래프와 진한 점선으로 표시한 신장트리

 

 (정의 1)

T 가 그래프 G 의 모든 정점을 포함하는 부분 그래프로서 트리이면, T 는 G 의 신장 트리 (spanning tree) 이다.

 

그림 2   그림 1의 그래프 G 의 다른 신장 트리 (진한 점선으로 표시)

 

 (예제 2)  

 (예제 3)

그래프 G 가 신장 트리 T 를 갖고 있다고 가정한다. 그리고 a 와 b 를 T 의 정점들이라고 하자. 그러면, a 와 b 는 T 의 정점들이고 T 는 트리이므로, a 에서 b 로의 경로 P 가 존재한다. 그러나 P 는 G 에서도 또한 a 에서 b 로의 경로의 역할을 한다 ; 따라서 G 는 연결되어 있다. 이것의 역도 또한 성립한다.

 

 (정리 4)

 

정리 4 의 증명을 기초로 한 신장 트리를 찾는 알고리즘은 매우 효율적이지는 않을 것이다 ; 순환을 찾는 데 많은 시간을 소요할 것이다. 우리는 좀더 나은 방법으로 이 작업을 수행할 수 있다. 먼저 신장 트리를 찾는 알고리즘을 예를 통해 설명하고, 그 다음 알고리즘을 기술하겠다.

 

 (예제 5)

 

예제 5의 방법을 정형화한 것이 알고리즘 6이다.

 

 (알고리즘 6)

연습 문제 16 은 알고리즘 6 이 신장 트리를 정확하게 찾는다는 것을 증명하는 것이다.  너비 우선 검색은 n 개의 정점을 가진 임의의 그래프 G 가 연결되어 있는지 아닌지를 검사하는 데도 사용될 수 있다 (연습 문제 26).  우리는 트리 T 를 생성하기 위해 알고리즘 6 의 방법을 사용한다. 그러면 "G 가 연결되어 있다." 는 "T 가 n 개의 정점을 갖는다." 의 필요 충분 조건이다.

너비 우선 검색은 또한 가중치가 없는 그래프에서 고정된 정점 v 에서 모든 다른 정점들의 최소 길이 경로를 찾는 데도 사용될 수 있다 (연습 문제 20). 우리는 알고리즘 6 의 방법을 v 를 뿌리로 하는 신장 트리를 생성하기 위해 사용한다. 우리는 신장 트리에서 정점 v 에서 레벨 i 인 정점으로의 최소 경로의 길이는 i 라는 것을 알 수 있다. Dijkstra 의 가중 그래프에 대한 최소 경로 알고리즘 (알고리즘 6.4.1) 은 너비 우선 검색을 일반화한 것으로서 간주될 수 있을 것이다 (연습 문제 21).

너비 우선 검색의 대안은 깊이 우선 검색 (Depth First Search) 이다.

 

 (알고리즘 7)     신장 트리를 구하기 위한 깊이 우선 검색

이 알고리즘은 깊이 우선 검색 방법을 사용하여 신장 트리를 찾아낸다.

입력 : v1, v2, ..., vn 으로 순서화된 정점들을 갖는 연결 그래프 G

출력: 신장 트리 T

연습 문제 17은 알고리즘 7 이 신장 트리를 정확하게 찾는다는 것을 증명하는 것이다.

 

 (예제 8)     

정점들의 순서를 abcdefgh 로 해서 그림 2 의 그래프에 대한 신장 트리를 구하기 위해, 깊이 우선 검색 (알고리즘 7) 을 사용하여라. 먼저 첫 번째 정점 a 를 선택하고, 그것을 뿌리로 한다 (그림 2). 그 다음 최소 레벨을 갖는 x 에 대해, 간선 (a, x) 를 트리에 추가한다. 여기서는 간선 (a, b) 가 추가된다.

이 작업을  반복하여, 간선 (b, d), (d, c), (c, e), (e, f)  그리고  (f, h)를 추가한다. 이 시점에서 우리는 (h, x) 형식의 간선을 추가할 수 없다.  따라서 h 의 부모 f 로 되돌아가서  (f, x) 형식의 간선을 추가하려고 시도한다. 그러나 여기서도 역시 (f, x) 형식의 간선을 추가할 수 없으므로, f 의 부모 e 로 되돌아간다.  이번에는 간선 (e, g) 를 성공적으로 추가할 수 있다. 이제는 더 이상의 간선들을 추가할 수 없으므로, 마침내 뿌리로 되돌아가게 되고, 작업은 끝이 난다.

알고리즘 7 중에서, 처음에 선택된 뿌리를 향해 간선을 따라 되돌아가는 라인 때문에, 깊이 우선 검색을 백트래킹 (backtracking) 이라고도 부른다. 다음 예제에서는 문제를 풀기 위해 백트래킹을 사용한다.

 

 (예제 9)     4-퀸 문제

4-퀸 문제는 4 × 4 그리드 상에 어떠한 두 토큰도 동일한 행, 열, 혹은 대각선에 놓이지 않도록 4 개의 토큰을 위치시키는 문제이다. 4-퀸 문제를 해결하기 위한 백트래킹 알고리즘을 구성하여라 (이런 용어를 사용한 이유는, 이것이 4 × 4  체스판에서 어떠한 퀸도 다른 퀸을 공격할 수 없도록 4 개의 퀸을 배치하는 문제이기 때문이다.)

알고리즘의 기본 생각은 열에 토큰을 계속적으로 위치시키는 것이다. 어떤 열에 토큰을 배치하는 것이 불가능할 때는, 되돌아가서 앞의 열의 토큰의 위치를 조정한다.

 

 (알고리즘 10)     백트래킹을 사용한 4-퀸 문제의 해결 방법

이  알고리즘은 4 × 4 그리드 상에 어떠한 두 토큰도 동일한 행, 열, 혹은 대각선에 놓이지 않도록 4 개의 토큰을 배치하는 방법을 찾기 위해 백트래킹을 사용한다.

입력: 크기 4 인 행의 배열

출력: true, 해결책이 있으면

false, 해결책이 없으면[만약 해결책이 있으면, 번째 퀸은 열 , 행 에 놓인다.]

알고리즘 10 이 생산하는 트리를 그림 3 에 나타내었다. 번호는 정점들이 생성된 순서를 나타낸다. 해결책은 정점 8 에서 구해졌다. n-퀸 문제는 n × n 그리드 상에 어떠한 두 토큰도 동일한 행, 열, 혹은 대각선에 놓이지 않도록 n 개의 토큰을 위치시키는 문제이다. 2-퀸 또는 3-퀸 문제에는 해결책이 없다는 것을 보이는 것은 어렵지 않다 (연습 문제 10). 우리는 방금 알고리즘 10 이 4-퀸 문제에 대한 해결책을 생성하는 많은 방법이 제안되었다 (참고 문헌 [Erbas] 등을 보아라).

백트래킹 즉, 깊이 우선 검색은 원하는 것이 하나의 해결책인 예제 9 와 같은 문제에서는 특별히 매력적이다. 만약 해결책이 존재한다면, 해결책은 말단 정점에서 구해지므로, 가능한 빨리 말단 정점으로 이동하는 것에 의해서 불필요한 정점들을 생성하는 것을 피할 수 있다.

 

그림 3  4-퀸 문제에 대한 해결책을 위한 검색에서 백트래킹 알고리즘(알고리즘 10) 이 생성하는 트리