G의 최소 비용 신장 트리

Download Report

Transcript G의 최소 비용 신장 트리

10장. 그래프(Graph)
1절. 그래프
2절. 그래프 표현
3절. 그래프 탐색
4절. 신장트리 및 최소비용 신장트리
이 완 직 ([email protected])
2010년 1학기
1. 그래프
• 선형 자료구조나 트리 자료구조로 표현하기 어려운“多:
多”의 관계를 가지는 원소들을 표현하기 위한 자료구조
– 정점(vertex)과 간선(edge)들의 집합
2
1.1 그래프 종류
• 무방향 그래프
– 두 정점을 연결하는 간선의 방향이 없는 그래프로서 양방향으로
갈 수 있다.
V(G1) ={A, B, C, D}
V(G2) ={A, B, C, D}
E(G1)={(A, B), (A, C), (A, D), (B, C), (C, D)}
E(G2) ={(A, B), (A, C)}
3
1.1 그래프 종류
• 방향 그래프
– 간선이 방향을 가지고 있는 그래프로서 도로의 일방통행 길처럼
간선을 통하여 한쪽 방향으로만 갈수 있다.
V(G3)={A, B, C, D}
V(G4)={A, B, C, D}
E(G3)={<A, B>, <A, D>, <D, B>, <C, D>}
E(G4)={<A, B>, <A, C>}
4
1.1 그래프 종류
• 완전 그래프
– 각 정점에서 다른 모든 정점을 연결하여 가능한의 최대 간선수를
가진 그래프이다.
5
1.1 그래프 종류
• 부분 그래프
– 원래의 그래프에서 일부의 정점이나 간선을 제외하여 만든 그래
프
– 그래프 G와 부분 그래프 G'는 다음과 같은 관계를 갖는다.
V(G')⊆V(G), E(G')⊆E(G)
6
1.1 그래프 종류
• 가중치 그래프(weighted graph) 또는 네트워크
(network) 간선에 비용이나 가중치가 할당된 그래프
7
1.2 그래프 관련 용어
• 인접 정점(adjacent vertex)
– 간선에 의해 연결된 정점을 의미한다.
• 차수(degree)
– 정점에 부속되어 있는 간선의 수를 말한다.
• 방향 그래프의 진입차수(in-degree)
– 정점을 머리로 하는 간선의 수로서 외부에서 오는 간선의 수
• 방향 그래프의 진출차수(out-degree)
– 정점을 꼬리로 하는 간선의 수의 수로서 외부로 향하는 간선의 수
• 경로(path)
– 그래프에서 간선을 따라 갈 수 있는 길을 순서대로 나열한 것.
8
1.2 그래프 관련 용어
• 경로길이(path length)
– 경로를 구성하는 간선의 수
• 사이클(cycle)
– 단순경로 중에서 경로의 시작 정점과 마지막 정점이 같은 경로
• 그래프와 트리의 차이점
– 트리는 사이클을 허용하지 않는다.
9
2. 그래프의 표현
• 그래프를 표현
– 정점에 대한 집합과 정점에 부속된 간선이 집합을 표현
• 그래프를 구현하기 위해서 필요한 연산
10
2.1 인접 행렬(adjacent matrix)
• 행렬에 대한 2차원 배열을 사용하는 순차 자료구조 방법
으로서 그래프를 메모리에 표현한 것
11
• [예제 10-1] 인접 행렬
12
2.2 인접 리스트(adjacent list)
• 각 정점에 대한 인접 정점들을 단순 연결 리스트로 표현
한것
13
• [예제 10-2] 인접 리스트
14
• [예제 10-2] 수행 결과
15
3. 그래프 탐색
• 그래프의 가장 기본적인 연산으로, 하나의 정점으로부터
시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것
• 그래프 탐색의 2가지 방법
– 깊이 우선 탐색(DFS: depth-first search)
– 너비우선 탐색(BFS: breadth-first search)
16
3.1 깊이우선 탐색(DFS)
• 한 방향으로 갈 수 있을 만큼 계속 가다가 더 이상 갈 수 없게 되면,
가장 마지막에 만났던 갈림길 간선이 있는 정점으로 되돌아온 후, 이
곳으로부터 다른 방향의 간선으로 탐색을 계속 반복하여 결국 모든
정점을 방문하는 방법이다.
① 그래프의 시작 정점 v를 결정하여 방문하고 방문하였다는 표시를 한
다.
② 정점 v에 인접한 정점 중에서 아직 방문하지 않은 정점 w가 있으면
정점 v를 스택에 push하고 w를 방문한다. 그리고 w를 v로 하여 다
시 를 반복한다. 방문하지 않은 정점이 없으면,탐색의 방향을 바꾸
기 위해 스택을 pop하여 받은 가장 마지막 방문 정점을 v로 하여 다
시 를 수행한다.
③ 스택이 공백이 될 때까지 를 반복한다.
17
3.1 깊이우선 탐색(DFS)
• 그래프 G에 대한 깊이우선 탐색 알고리즘
• 초기상태
– 배열 visited를 false로 초기화하고 공백 스택을 생성
18
3.1 깊이우선 탐색(DFS)
① 정점 A를 시작으로 깊이우선 탐색을 시작한다.
visited[A] ← true;
A 방문;
19
②
정점 A에 방문하지 않은 정점 B, E가 있으므로 A를 스택에 push하고 인접
정점 B와 E 중, 오름차순에 따라 B를 선택하여 탐색을 계속
push(stack, A);
visited[B] ← true;
B 방문;
20
③ 정점 B에 방문하지 않은 정점 C, D가 있으므로 B를 스택에 push하
고 인접정점 C와 D 중에서 오름차순에 따라 C를 선택하여 탐색을
계속
push(stack, B);
visited[C] ← true;
C 방문
21
④ 정점 C에 방문하지 않은 정점 D, E가 있으므로 C를 스택에 push하
고 인접정점 D와 E 중 오름차순에 따라 D를 선택하여 탐색을 계속
push(stack, C);
visited[D] ← true;
D 방문;
22
⑤ 정점 D에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로
돌아가기 위해서 스택을 pop하여 받은 정점 C에 대하여 방문하지
않은 인접정점이 있는지 확인한다.
pop(stack);
23
⑥ 정점 C에 방문하지 않은 정점 E가 있으므로 C를 스택에 push하고
인접정점 E를 선택하여 탐색을 계속한다.
push(stack, C);
visited[E] ← true;
E 방문;
24
⑦ 정점 E에 방문하지 않은 정점 F가 있으므로 E를 스택에 push하고
인접정점 F를 선택하여 탐색을 계속한다.
push(stack, E);
visited[F] ← true;
F 방문;
25
⑧ 정점 F에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로
돌아가기 위해서 스택을 pop하여 받은 정점 E에 대하여 방문하지
않은 인접정점이 있는지 확인한다.
pop(stack);
26
⑨ 정점 E에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로
돌아가기 위해서 스택을 pop하여 받은 정점 C에 대하여 방문하지
않은 인접정점이 있는지 확인한다.
pop(stack);
27
⑩ 정점 C에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로
돌아가기 위해서 스택을 pop하여 받은 정점 B에 대하여 방문하지
않은 인접정점이 있는지 확인한다.
pop(stack);
28
⑪ 정점 B에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로
돌아가기 위해서 스택을 pop하여 받은 정점 A에 대하여 방문하지
않은 인접정점이 있는지 확인한다.
pop(stack);
29
⑫ A에 방문하지 않은 인접 정점이 없고, 스택도 공백이므로 종료
•
스택 탐색한 경로 순서는 A-B-C-D-E-F이다
1)
5)
2)
3)
6)
4)
30
3.2 너비우선 탐색(BFS)
• 시작 정점으로부터 인접한 정점들을 모두 차례로 방문하고, 방문했
던 정점을 시작으로 하여 다시 인접한 정점들을 차례로 방문하는 방
식
① 시작 정점 v를 결정하여 방문하고 방문 표시를 한다.
② 정점 v에 인접한 정점들 중에서 방문하지 않은 정점을 차례로 방문
하면서 큐에 enQueue한다.
③ 방문하지 않은 인접한 정점이 없으면, 방문했던 정점에서 인접한 정
점들을 다시 차례로 방문하기 위해 큐에서 deQueue하여 구한 정점
에서 를 반복한다.
④ 큐가 공백이 될 때까지 ~을 반복한다.
31
• 초기상태
– 배열 visited를 false로 초기화하고 공백 큐를 생성
32
① 정점 A를 시작으로 너비우선 탐색을 시작한다.
visited[A] ← true;
A 방문;
33
② 방문하지 않은 정점 A의 모든 인접정점 B, E를 방문하고, 큐에
enQueue한다.
visited[(방문하지 않은 A의 인접정점 B와 E)] ← true;
(방문하지 않은 A의 인접정점 B와 E) 방문;
enQueue(Q, (방문하지 않은 A의 인접정점 B와 E));
B와 E에 방문
34
③ 정점 A에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속
수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 B를 구한
다.
v ← deQueue(Q);
35
④ 방문하지 않은 정점 B의 인접정점 C를 방문하고 큐에 enQueue
visited[(방문하지 않은 B의 인접정점 C)] ← true;
(방문하지 않은 B의 인접정점 C 방문;
enQueue(Q, (방문하지 않은 B의 인접정점 C));
36
⑤ 정점 B에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속
수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 E를 구한다.
v ← deQueue(Q);
37
⑥ 정점 E의 방문하지 않은 인접정점 F를 방문하고 큐에 enQueue
visited[(방문하지 않은 E의 인접정점 F)] ← true;
(방문하지 않은 E의 인접정점 F 방문;
enQueue(Q, (방문하지 않은 E의 인접정점 F));
38
⑦ 정점 E에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속
수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 C를 구한
다.
v ← deQueue(Q);
39
⑧ 방문하지 않은 정점 C의 인접정점 D를 방문하고 큐에 enQueue
visited[(방문하지 않은 C의 인접정점 D)] ← true;
(방문하지 않은 C의 인접정점 D) 방문;
enQueue(Q, (방문하지 않은 C의 인접정점 D));
40
⑨ 정점 C에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속
수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 F를 구한다.
v ← deQueue(Q);
41
⑩ 정점 F에는 방문하지 않은 인접정점이 없으므로 너비우선 탐색을
계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 D를
구한다.
v ← deQueue(Q);
42
⑪ 방문하지 않은 정점 D의 인접정점이 없으므로 너비우선 탐색을 계
속 수행할 다음 정점을 찾기 위해 큐를 deQueue하는데 큐가 공백
이므로 너비우선 탐색을 종료한다.
•
그래프 G의 너비우선 탐색 경로는A—B—E—C—F—D이다.
43
4. 신장 트리와 최소비용 신장 트리
• 신장 트리(spanning tree)
– n개의 정점으로 이루어진 무방향 그래프 G에서 n개의 모든 정점
과 n-1개의 간선으로 만들어진 트리
– 최소의 간선을 이용해 모든 정점을 연결한 그래프
• 깊이우선 신장 트리(depth first spanning tree)
– 깊이우선 탐색을 이용하여 생성된 신장 트리
• 너비우선 신장 트리(breadth first spanning tree)
– 너비우선 탐색을 이용하여 생성된 신장 트리
44
4. 신장 트리와 최소비용 신장 트리
• G1의 깊이우선 신장 트리 및 너비우선 신장 트리
45
4. 신장 트리와 최소비용 신장 트리
• 그래프 G1과 신장 트리의 예
46
4.1 최소비용 신장 트리
• 최소비용 신장 트리(MCST: Minimum Cost Spanning
Tree)
– 주어진 무방향 가중치 그래프의 신장 트리 중 전체 가중치의 합
이 최소가 되는 트리
• 활용분야
– 도로의 길이가 최소가 되도록 하는 도로망 건설
– 최소의 네트워크 선을 사용하여 시스템을 연결해야 하는 통신망
설계
• 최소비용 신장 트리를 만드는 알고리즘
– 크루스칼(Kruskal) 알고리즘와 프라임(Prime) 알고리즘
47
4.2 크루스칼 알고리즘
• Greedy Algorithm의 일종
– “일단 가설 비용이 제일 싼 것부터 먼저 건설하고 보자”
– “당장 눈앞에 보이는 이득을 추구하는 것이 추후에 전체적으로
크게 봐도 이득이 된다”
❶ 그래프 G의 모든 간선을 가중치에 따라 오름차순으로 정리한다.
❷ 그래프 G에 가중치가 가장 작은 간선을 삽입한다. 이때 사이클을
형성하는
간선은 삽입할 수 없으므로 이런 경우에는 그 다음으로 가중치가 작은
간선을 삽입한다.
❸ 그래프 G에 n – 1 개의 간선을 삽입할 때까지 ❷를 반복한다.
❹ 그래프 G의 간선이 n - 1개가 되면 최소비용 신장 트리가 완성된다.
48
• Kruskal 알고리즘을 이용하여 G의 최소 비용 신장 트리 만들기
초기 상태 : 그래프 G의 간선을 가중치에 따라서 오름차순 정렬
49
① 가중치가 가장 작은 간선 (E,G) 삽입.
– (현재 삽입한 간선의 수 : 1개)
50
② 나머지 간선 중에서 가중치가 가장 작은 간선 (A,B) 삽
입.
– (현재 삽입한 간선의 수 : 2개)
51
③ 나머지 간선 중에서 가중치가 가장 작은 간선 (E,F) 삽입.
– (현재 삽입한 간선의 수 : 3개)
52
④ 나머지 간선 중에서 가중치가 가장 작은 간선 (B,D) 삽
입.
– (현재 삽입한 간선의 수 : 4개)
53
⑤ 나머지 간선 중에서 가중치가 가장 작은 간선 (A,D)를 삽입하면 AB-D의 사이클이 생성되므로 삽입할 수 없다. 그 다음으로 가중치가
가장 작은 간선 (C,F) 삽입.
– (현재 삽입한 간선의 수 : 5개)
54
• ⑥ 나머지 간선 중에서 가중치가 가장 작은 간선 (D,E) 삽입.
– (현재 삽입한 간선의 수 : 6개)
– 현재 삽입한 간선의 수가 6개 이므로 알고리즘 수행을 종료하고 신장 트리 완성
55
• G의 최소 비용 신장 트리
56
4.3 프라임(Prime) 알고리즘
• 간선을 정렬하지 않고 하나의 정점에서 시작하여 트리를
확장해나가는 방법이다.
❶ 그래프 G에서 시작 정점을 선택한다.
❷ 선택한 정점에 부속된 모든 간선 중에서 가중치가 가장 작은 간선을
연결하여 트리를 확장한다.
❸ 이전에 선택한 정점과 새로 확장된 정점에 부속된 모든 간선 중에서
가중치가 가장 작은 간선을 삽입한다. 이때 사이클을 형성하는 간선은
삽입할 수 없으므로 그 다음으로 가중치가 작은 간선을 선택한다.
❹ 그래프 G에 n - 1개의 간선을 삽입할 때까지 ❸을 반복한다.
❺ 그래프 G의 간선이 n - 1개가 되면 최소비용 신장 트리가 완성된다.
57
• Prime 알고리즘을 이용하여 G의 최소 비용 신장 트리 만들기
– 초기 상태 : 그래프 G의 정점 중에서 정점 A를 시작 정점으로 선택
58
① 정점 A에 부속된 간선 중에서 가중치가 가장 작은 간선 (A,B)을 삽
입하여 트리 확장.
– (현재 삽입한 간선의 수 : 1개)
59
② 현재 확장된 트리의 정점 A, B에 부속된 간선 중에서 가중치가 가장
작은 간선 (B,D)를 삽입하여 트리 확장.
– (현재 삽입한 간선의 수 : 2개)
60
③ 현재 확장된 트리의 정점 A, B, D에 부속된 간선 중에서 가중치가 가
장 작은 간선 (A,D)를 삽입하면 A-B-D의 사이클이 생성되므로 삽
입할 수 없다. 따라서 그 다음으로 가중치가 가장 작은 간선 (D,E)
삽입.
– (현재 삽입한 간선의 수 : 3개, 삽입 불가능한 간선 : (A,D))
61
④ 현재 확장된 트리의 정점 A, B, D, E에 부속된 간선 중에서 가중치가
가장 작은 간선 (E,G)를 삽입하여 트리 확장.
– (현재 삽입한 간선의 수 : 4개, 삽입 불가능한 간선 : (A,D))
62
⑤ 현재 확장된 트리의 정점 A, B, D, E, G에 부속된 간선 중에서 가중
치가 가장 작은 간선 (E,F)를 삽입하여 트리 확장.
– (현재 삽입한 간선의 수 : 5개, 삽입 불가능한 간선 : (A,D))
63
⑥ 현재 확장된 트리의 정점 A, B, D, E, F, G에 부속된 간선 중에서 가중치가
가장 작은 간선 (C,F)를 삽입하여 트리 확장.
–
–
(현재 삽입한 간선의 수 : 6개, 삽입 불가능한 간선 : (A,D))
현재 남은 간선의 수가 6개 이므로 알고리즘 수행을 종료하고 신장 트리 완성.
64
• G의 최소 비용 신장 트리
65